Sidekiq进程有一个单独的日志文件

时间:2015-09-08 12:16:32

标签: ruby-on-rails ruby sidekiq

目前我运行sidekiq,如

bundle exec sidekiq

它将输出记录到log/sidekiq.log。但是我想为它运行的每个进程提供单独的文件。

例如,如果第一个进程运行,则应创建sidekiq_1.log

2 个答案:

答案 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
    ...