Sidekiq 工作人员的不同日志级别 - Ruby 方法?
Posted
技术标签:
【中文标题】Sidekiq 工作人员的不同日志级别 - Ruby 方法?【英文标题】:Different log level for Sidekiq workers - Ruby approach? 【发布时间】:2013-01-18 08:46:59 【问题描述】:我有一个运行环境,其中包含用于调度目的的 Rails 应用程序、Sidekiq 和发条模块。
我有许多不同的工作人员,充满了 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记录器使用的输出格式,在每个worker中添加一个记录器方法
def logger
logger = MyLogger.new
end
并在需要时在初始化方法中更改级别
这是 Ruby 中最好的方法吗?
【问题讨论】:
【参考方案1】:我有一个类似的问题,我发现这个帖子更有用:
Log to different logger based on call from Sidekiq or Rails
您应该可以通过更改 Rails.logger 来专门在此处提到的块中设置 Sidekiq 工作人员的日志级别。
【讨论】:
【参考方案2】:我不知道这是否是最好的方法,但我会做以下事情。首先,让我们准备函数来检索调用者的文件名和/或方法:
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
我知道这看起来很奇怪,但对我来说效果很好。
【讨论】:
这是一个奇怪的 hack,但这是“Sidekiq 记录器使用的复制输出格式”的一部分,Sidekiq 格式化程序的复制和粘贴 :-) 我想知道是否有更好的方法,比如实例化 Sidekiq使用 DEBUG 记录器,另一个使用 INFO 记录器 嗯……你不需要打破 Sidekiq 格式化程序。只需将所有文件的 level 设置为 DEBUG,然后检查您是否希望看到 THAT 打印,如果是则移交默认格式化程序(参见几乎相同的示例 @ruby-doc.org/stdlib-1.9.3//libdoc/logger/rdoc/Logger.html)。以上是关于Sidekiq 工作人员的不同日志级别 - Ruby 方法?的主要内容,如果未能解决你的问题,请参考以下文章