【发布时间】:2026-01-16 19:50:01
【问题描述】:
我正在编写一个多记录器实现,以使我的应用程序能够记录到多个后端。实现如下:
class MultiLogger < Logger
def initialize(loggers = [])
@loggers = []
end
def add(severity, message, _attributes, _environment, progname)
@loggers.each do |logger|
logger.add(severity, message, progname)
end
end
def info(message, attributes, environment, progname)
add(Logger::INFO, message, attributes, environment, progname)
end
...
end
基本上,我只是将发给MultiLogger#add 的调用转发给实例化期间关联的所有记录器。问题是我需要将该记录器设置为 Rails 的默认记录器,但我不能这样做。
我正在将config.logger = MultiLogger.new([Logger1.new, Logger2.new]) 添加到我的application.rb 文件中,但是当我调用logger.info 时,我收到了与add 方法的数量相关的错误。
最奇怪的是,我的自定义 add 从未被调用,并且该错误是从 ActiveSupport::LogerThreadSafeLevel#add 引发的,如下所示:.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/logger_thread_safe_level.rb:51:in 'add'。
我认为我遗漏了有关 Rails 日志记录机制内部工作原理的一些重要内容……但是什么? ActiveSupport 是否覆盖了我的 add 方法?我该怎么做才能避免这种情况?
【问题讨论】:
标签: ruby logging ruby-on-rails-6 ruby-2.6