根据Sidekiq或Rails的调用记录到不同的记录器

时间:2013-08-07 19:37:55

标签: sidekiq

我有一个基于Rails 3.2的应用程序,它使用Sidekiq 2.12来运行后台作业。 Sidekiq作业可以调用与交互式Rails应用程序相同的方法。我希望这些方法在从Sidekiq调用时登录到Sidekiq日志,并在从Rails调用时登录到Rails日志。我正在寻找一种干净的方法来做到这一点,但到目前为止已经空了。

在这两种环境中,Sidekiq::Logging.loggerRails.logger都已定义并正常工作。

  • 我不想在每次登录尝试时检查调用堆栈,以便选择正确的loggger。
  • 我不想将日志对象作为函数参数传递给可能从Sidekiq和Rails调用的每个函数。

我认为正确的做法是让Sidekiq在启动过程中用其记录器替换Rails记录器,然后始终登录到Rails记录器,但我找不到在Rails记录器之后运行的初始化器挂钩已设置但在Sidekiq作业启动之前,仅由Sidekiq运行。

有这样的钩子吗?如果是这样,请告诉我。如果没有,请提供其他建议,了解如何根据Sidekiq vs Rails运行环境干净地重定向日志输出。

1 个答案:

答案 0 :(得分:27)

Sidekiq和Rails都使用Ruby StdLib中的Logger兼容类。

您应该能够重新配置Rails记录器以在Sidekiq服务器配置块中使用Sidekiq记录器。查找/创建类似config/inititializers/sidekiq.rb的文件:

Sidekiq.configure_server do |config|
  Rails.logger = Sidekiq::Logging.logger

  # Sidekiq other server config
  ...
end

传递给Sidekiq.configure_server调用的块仅在Sidekiq后端的Server组件中执行,而不是在Rails应用服务器或控制台中运行的客户端内执行。