目前我运行sidekiq,如
bundle exec sidekiq
它将输出记录到log/sidekiq.log
。但是我想为它运行的每个进程提供单独的文件。
例如,如果第一个进程运行,则应创建sidekiq_1.log
。
答案 0 :(得分:3)
我假设您正在运行Rails项目。如果您使用新的ActiveJob框架(可在Rails 4.2中使用),则可以添加class MyJob < ActiveJob::Base
queue_as :default
before_enqueue do |job|
logger = ActiveSupport::Logger.new("#{self.class}-#{job.job_id}.log")
end
def perform(*args)
# Do something later
end
end
回调并在执行作业之前更改记录器。因此,每个作业都会记录到自己的文件中。
示例:
class BaseJob < ActiveJob::Base
before_enqueue do |job|
logger = ActiveSupport::Logger.new("#{self.class}-#{job.job_id}.log")
end
end
class MyJob < BaseJob
queue_as :default
def perform(*args)
logger.info 'Performing MyJob'
end
end
class AnotherJob < BaseJob
queue_as :default
def perform(*args)
logger.info { 'Performing AnotherJob' }
end
end
如果您想要为几个作业登录不同的文件,您可以创建一个基类并从那里继承。
示例:
Sidekiq::Worker
如果您使用class Sidekiq::Middleware::Server::PerJobLogger
def call(worker, job, queue)
# Change logger
Sidekiq.logger = ActiveSupport::Logger.new("#{job[:id]}.log")
yield
end
end
,则可以使用Server-side middleware执行相同的操作,该Google.Apis.AndroidPublisher.v2运行&#39;工作处理:
Sidekiq
然后使用Sidekiq.configure_server do |config|
config.server_middleware do |chain|
chain.add Sidekiq::Middleware::Server::PerJobLogger
end
end
注册中间件:
Sidekiq::Worker
小心,每个工作的记录&#34;&#34;方法可能会耗尽文件描述符,特别是如果您的系统处理大量工作。
注意:我还没有测试Logger
解决方案。即使package main
import(
"bytes"
"fmt"
"io/ioutil"
"os"
"os/exec"
)
func createShortcut(linkName string, target string, arguments string, directory string, description string, destination string) {
var scriptTxt bytes.Buffer
scriptTxt.WriteString("option explicit\n\n")
scriptTxt.WriteString("sub CreateShortCut()\n")
scriptTxt.WriteString("dim objShell, strDesktopPath, objLink\n")
scriptTxt.WriteString("set objShell = CreateObject(\"WScript.Shell\")\n")
scriptTxt.WriteString("strDesktopPath = objShell.SpecialFolders(\"")
scriptTxt.WriteString(destination)
scriptTxt.WriteString("\")\n")
scriptTxt.WriteString("set objLink = objShell.CreateShortcut(strDesktopPath & \"\\")
scriptTxt.WriteString(linkName)
scriptTxt.WriteString(".lnk\")\n")
scriptTxt.WriteString("objLink.Arguments = \"")
scriptTxt.WriteString(arguments)
scriptTxt.WriteString("\"\n")
scriptTxt.WriteString("objLink.Description = \"")
scriptTxt.WriteString(description)
scriptTxt.WriteString("\"\n")
scriptTxt.WriteString("objLink.TargetPath = \"")
scriptTxt.WriteString(target)
scriptTxt.WriteString("\"\n")
scriptTxt.WriteString("objLink.WindowStyle = 1\n")
scriptTxt.WriteString("objLink.WorkingDirectory = \"")
scriptTxt.WriteString(directory)
scriptTxt.WriteString("\"\n")
scriptTxt.WriteString("objLink.Save\nend sub\n\n")
scriptTxt.WriteString("call CreateShortCut()")
fmt.Print(scriptTxt.String())
filename := fmt.Sprintf("lnkTo%s.vbs", destination)
ioutil.WriteFile(filename, scriptTxt.Bytes(), 0777)
cmd := exec.Command("wscript", filename)
err := cmd.Run()
if err != nil {
fmt.Println(err)
}
cmd.Wait()
os.Remove(filename)
return
}
是线程安全的,我也没有检查过Sidekiq如何使用它。但我相信你会好起来的。
答案 1 :(得分:0)
为每个流程指定一个日志文件,然后
bundle exec sidekiq --logfile log/sidekiq_1.log
bundle exec sidekiq --logfile log/sidekiq_2.log
阅读帮助帮助
[0] % sidekiq --help
...
-L, --logfile PATH path to writable logfile
...