如何解决Rails是否会覆盖ruby的默认记录器?
我正在编写一个multilogger实施程序,以使我的应用程序能够登录到多个后端。实现如下:
class MultiLogger < Logger
def initialize(loggers = [])
@loggers = []
end
def add(severity,message,_attributes,_environment,progname)
@loggers.each do |logger|
logger.add(severity,progname)
end
end
def info(message,attributes,environment,progname)
add(Logger::INFO,progname)
end
...
end
基本上,我只是将发给MultiLogger#add
的呼叫转发给实例化期间关联的所有记录器。问题是我需要将该记录器设置为Rails的默认记录器,但我不能这样做。
我正在将config.logger = MultiLogger.new([Logger1.new,Logger2.new])
添加到我的application.rb
文件中,但是当我调用logger.info
时,却遇到了与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
方法?为了避免这种情况该怎么办?
解决方法
使用ActiveSupport :: Logger或修改应用程序配置文件
默认情况下,Rails希望记录器是ActiveSupport :: Logger的实例。但是,您可以修改application.rb以使用其他兼容的东西。 Rails documentation说:
,2.1什么是记录仪?
Rails利用ActiveSupport :: Logger类编写日志 信息。其他记录器,例如Log4r,也可以替换。
您可以在config / application.rb或任何其他文件中指定备用记录器 其他环境文件[。]
Rails希望Logger#add方法遵循Ruby记录器的接口,即一个强制性参数(severity
),然后是两个可选参数(message
和{{1 }})以及可选块。
在这里,Rails还假定了非常特殊的语义,记录器实现如何使用这些参数来构建最终消息(传递progname
,message
,块或它们的任意组合时)
progname
在您的原始代码中,您已经在class MultiLogger
def add(severity,message = nil,progname = nil,&block)
@loggers.each do |logger|
logger.add(severity,message,progname,&block)
end
true
end
def info(message = nil,&block)
add(Logger::INFO,&block)
end
# ...
end
方法中定义了其他强制性参数(即add
和_attributes
),这些参数在调用该方法时未提供,因此称为Exception。修复参数列表(并实现缺少的快捷方式和访问器)后,一切都会正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。