将Sidekiq进程拥有独立的日志文件

3

目前我使用如下方式运行sidekiq:

bundle exec sidekiq

它将输出日志记录到log/sidekiq.log。但我希望每个运行的进程都有单独的文件。

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

2个回答

6

我假设你正在运行一个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如何使用它。但我相信你会没问题的。


1
指定每个进程的日志文件。
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
    ...

当我创建一个Rails记录时,几秒钟后会添加一个Sidekiq进程,然后开始执行该进程。对于该进程,我需要一个文件。我不能像你说的那样运行。 - Anbazhagan p
1
你难道不是混淆了术语吗?你说的是“sidekiq进程”,但似乎你指的是“sidekiq任务”。到底是哪一个? - Sergio Tulentsev
1
Sidekiq 6已经取消了日志文件重定向,现在只会记录到标准输出(stdout)。 - Ghazi
@Ghazi 也在苦恼同样的问题。我非常需要一个单独的文件和日志轮换。 - cool_php
ERROR: Logfile redirection was removed in Sidekiq 6.0, Sidekiq will only log to STDOUT - Jin Lim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接