Rails是否会覆盖ruby的默认记录器?

如何解决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还假定了非常特殊的语义,记录器实现如何使用这些参数来构建最终消息(传递prognamemessage,块或它们的任意组合时)

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?