11

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

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

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

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

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

4

1 回答 1

31

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

您应该能够重新配置 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 后端的服务器组件内执行,而不是在 Rails 应用程序服务器或控制台中运行的客户端内执行。

于 2013-08-08T16:21:49.260 回答