Rails是否覆盖ruby';默认记录器是什么?
我正在编写一个多记录器实现,以便使我的应用程序能够登录到多个后端。实现如下所示:Rails是否覆盖ruby';默认记录器是什么?,ruby,logging,ruby-on-rails-6,ruby-2.6,Ruby,Logging,Ruby On Rails 6,Ruby 2.6,我正在编写一个多记录器实现,以便使我的应用程序能够登录到多个后端。实现如下所示: class多重记录器
class多重记录器
基本上,我只是将发出的呼叫转发给MultiLogger#将添加到实例化期间关联的所有记录器。问题是我需要将该记录器设置为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\u support/logger\u thread\u safe\u level.rb:51:in'add'
我想我遗漏了一些关于Rails日志机制内部工作的重要信息。。。但是什么呢?ActiveSupport
是否覆盖了我的add
方法?如何避免这种情况?使用ActiveSupport::Logger或修改应用程序配置文件
默认情况下,Rails希望记录器是ActiveSupport::logger的实例。但是,您可以修改application.rb以使用其他兼容的内容。报告说:
2.1什么是记录器?
Rails使用ActiveSupport::Logger类来编写日志
信息也可以替换其他记录器,例如Log4r
您可以在config/application.rb或任何
其他环境文件[.]
Rails希望Logger#add方法遵循Ruby Logger的接口,即一个强制参数(严重性和两个可选参数(消息和progname
)以及一个可选块
在这里,Rails还假设了记录器实现如何使用这些参数来构建最终消息的非常具体的语义(当传递消息
、程序名
、块或其任何组合时)
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, message, &block)
end
# ...
end
在原始代码中,您在add
方法(即\u attributes
和\u environment
)中定义了附加的强制参数,这些参数在调用该方法时未提供,因此是一个例外。一旦您修复了参数列表(并实现缺少的快捷方式方法和访问器),一切都应该正常