Sidekiq工作者的日志级别不同 - Ruby方法?

时间:2013-02-03 14:16:47

标签: ruby logging sidekiq

我有一个运行环境,带有Rails应用程序,Sidekiq和clockwork mod用于调度目的。

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

我目前的设置错过了为某些工作人员激活DEBUG等级的可能性,而将其他工作人员保留在标准INFO中。

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

class SendMailOnStart

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

    def initialize
      logger.level = Logger::INFO
    end

    .... ...

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

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

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

def logger
  logger = MyLogger.new
end

并在初始化方法

中更改我的水平

这是Ruby中最好的方法吗?

2 个答案:

答案 0 :(得分: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实例的默认formatter,强制它检查调用者:

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

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

答案 1 :(得分:0)

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

Log to different logger based on call from Sidekiq or Rails

您应该可以通过更改Rails.logger来专门为那里提到的块设置Sidekiq worker的日志级别。