我有一个运行环境,带有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中最好的方法吗?
答案 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的日志级别。