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则应创建它。
我假设您正在运行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如何使用它。但是我相信你会没事的。
| 归档时间: |
|
| 查看次数: |
1516 次 |
| 最近记录: |