Sidekiq进程具有单个日志文件

Anb*_*n p 3 ruby ruby-on-rails sidekiq

目前我像运行sidekiq

bundle exec sidekiq
Run Code Online (Sandbox Code Playgroud)

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

例如,如果首先运行流程,sidekiq_1.log则应创建它。

fot*_*tos 5

我假设您正在运行Rails项目。如果您正在使用新的ActiveJob框架(在Rails 4.2中可用),则可以执行作业之前添加before_perform回调并更改记录器。因此,每个作业将记录到其自己的文件中。

例:

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
Run Code Online (Sandbox Code Playgroud)

如果要登录几个作业的不同文件,则可以创建一个基类并从那里继承。

例:

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
Run Code Online (Sandbox Code Playgroud)

如果您使用服务器端中间件,则可以使用“围绕”作业处理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
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令注册中间件Sidekiq

Sidekiq.configure_server do |config|
  config.server_middleware do |chain|
    chain.add Sidekiq::Middleware::Server::PerJobLogger
  end
end
Run Code Online (Sandbox Code Playgroud)

请小心,使用“每个作业的日志”方法可能会用完文件描述符,尤其是在系统处理大量作业的情况下。

注意:我尚未测试Sidekiq::Worker解决方案。即使Logger是线程安全的,我也没有检查Sidekiq如何使用它。但是我相信你会没事的。