1

我有一个带有 Rails 应用程序、Sidekiq 和发条模块的运行环境,用于调度目的。

我有许多不同的工作人员,充满了 logger.debug 和 logger.info 指令,我偶尔需要激活其中一些工作人员的调试日志以了解发生了什么。我喜欢 Sidekiq 记录器,我想使用它,因为它只需要工人中的“logger.debug”指令来完成它的工作。

我目前的设置错过了为一些工作人员激活调试级别的可能性,而将其他工作人员留在标准信息中。

现在在我的每个工人中,我都有这个初始化方法:

class SendMailOnStart

   include Sidekiq::Worker
   sidekiq_options :retry => false, :queue => :critical

    def initialize
      logger.level = Logger::INFO
    end

    .... ...

但是如果改变一个工人的级别,这个级别将被下一个指定的级别覆盖 - 例如,如果两个工人一起处理,第二个工人将“获胜”。

以优雅的方式实现这一目标的最佳方法是什么?

来自 Java 世界,我只想创建一个自定义记录器并将其放入每个工作人员中,复制 Sidekiq 记录器使用的输出格式,在每个工作人员中添加一个记录器方法,例如

def logger
  logger = MyLogger.new
end

并在我需要时在初始化方法中更改级别

这是 Ruby 中最好的方法吗?

4

2 回答 2

1

我有一个类似的问题,我发现这个线程更有用:

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

您应该能够通过更改 Rails.logger 专门在此处提到的块中设置 Sidekiq 工作人员的日志级别。

于 2015-02-25T13:59:19.693 回答
0

我不知道这是否是最好的方法,但我会做以下事情。首先,让我们准备函数来检索调用者的文件名和/或方法:

  def parse_caller
    # magic number 7 below is the amount of calls 
    #   on stack to unwind to get your caller
    if /^(?<file>.+?):(?<line>\d+)(?::in `(?<method>.*)')?/ =~ caller(7).first
      file      = Regexp.last_match[:file]
      line      = Regexp.last_match[:line].to_i
      method    = Regexp.last_match[:method]
      [file, line, method]
    end
  end

然后我会覆盖实例的默认格式化程序Logger强制它检查调用者:

  logger.formatter = lambda do |severity, datetime, progname, msg|
    f,l,m = parse_caller
    # HERE GOES YOUR CHECK
    if f =~ /…/
      …
    end
  end

我知道这看起来很奇怪,但对我来说效果很好。

于 2013-02-03T17:01:37.933 回答