ruby - Rails 会覆盖 ruby 的默认记录器吗?
问题描述
我正在编写一个多记录器实现,以使我的应用程序能够记录到多个后端。实现看起来像:
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
方法吗?我能做些什么来避免这种情况?
解决方案
使用 ActiveSupport::Logger 或修改应用程序配置文件
默认情况下,Rails 期望记录器是 ActiveSupport::Logger 的一个实例。但是,您可以修改 application.rb 以使用其他兼容的东西。Rails 文档说:
2.1 什么是记录器?
Rails 使用 ActiveSupport::Logger 类来写入日志信息。也可以替换其他记录器,例如 Log4r。
您可以在 config/application.rb 或任何其他环境文件[.] 中指定替代记录器
推荐阅读
- javascript - slick.js 末尾有额外的空间
- python - python2.7中未安装pytesseract包&python3树莓派中未安装opencv
- r - 寻找 R 功能将数据框中的数字列拆分为具有 3 个级别的分类变量
- python - ImportError:如何让 F2PY 在 Apple M1 上运行?
- c# - 投射 IQueryable
到 IQueryable 具有更好的性能 - image-processing - ImageMagick/etc.:从扫描中自动去除不干净的边缘?
- django - 通过 Django 中的子查询更新字段
- swiftui - 需要在用户滚动视图 SwiftUI 时停止更新整个视图
- angular - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“对象”TS7053
- java - 动态映射 json