目前我使用如下方式运行sidekiq:
bundle exec sidekiq
它将输出日志记录到log/sidekiq.log
。但我希望每个运行的进程都有单独的文件。
例如,如果第一个进程运行,则应创建sidekiq_1.log
。
目前我使用如下方式运行sidekiq:
bundle exec sidekiq
它将输出日志记录到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
如果您想为几个作业记录不同的日志文件,可以创建一个基类并从那里进行继承。
例如:
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
,您可以使用服务器端中间件来执行相同的操作,该中间件在作业处理期间运行 'around':class Sidekiq::Middleware::Server::PerJobLogger
def call(worker, job, queue)
# Change logger
Sidekiq.logger = ActiveSupport::Logger.new("#{job[:id]}.log")
yield
end
end
然后使用Sidekiq
注册中间件:
Sidekiq.configure_server do |config|
config.server_middleware do |chain|
chain.add Sidekiq::Middleware::Server::PerJobLogger
end
end
请注意,“每个作业一个日志文件”的方法可能会耗尽文件描述符,特别是如果您的系统处理了大量作业。
注意:我没有测试Sidekiq :: Worker
解决方案。即使Logger
是线程安全的,我也没有检查Sidekiq如何使用它。但我相信你会没问题的。
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
...
ERROR: Logfile redirection was removed in Sidekiq 6.0, Sidekiq will only log to STDOUT
- Jin Lim