Ruby 停止ActiveSupport::标记日志以避免干扰结构化日志
Ruby 停止ActiveSupport::标记日志以避免干扰结构化日志,ruby,logging,activesupport,ruby-on-rails-6,Ruby,Logging,Activesupport,Ruby On Rails 6,ActiveSupport::taggedloging通过Object#extend将ActiveSupport::taggedloging::Formatter附加到当前格式化程序的继承链 不幸的是,ActiveSupport::taggedloging::Formatter#call 假设msg参数始终是字符串,导致 将标记预先添加到散列中时会产生垃圾(例如,使用Lograge和)。某些标准库,比如,坚持注入taggedloging 我想出了下面的元编程技巧,以防止ActiveSupport
ActiveSupport::taggedloging
通过Object#extend
将ActiveSupport::taggedloging::Formatter
附加到当前格式化程序的继承链
不幸的是,ActiveSupport::taggedloging::Formatter#call
假设msg
参数始终是字符串,导致
将标记预先添加到散列中时会产生垃圾(例如,使用Lograge和)。某些标准库,比如,坚持注入taggedloging
我想出了下面的元编程技巧,以防止ActiveSupport::taggedloging::Formatter#call
覆盖超类实现(在本例中,来自Ougai):
class MyBunyanFormatter
但它笨重且违反直觉,我对此并不感到兴奋
另一种选择似乎是编写一个自定义记录器,实现taged()
:
class MyLogger
这至少不涉及任何元编程把戏,但我想知道除了Webpacker之外,我是否可以指望其他库不注入taggedloging
当然,自从人们开始尝试从Rails应用程序进行结构化日志记录以来,我不是第一个遇到这个问题的人。正确的解决方案是什么?中给出的解决方案是使用monkey patch标记日志来消除这种行为
module ActiveSupport::TaggedLogging::Formatter
def调用(严重性、时间、程序名、数据)
data={msg:data.to_s},除非data.is_a?(散列)
标签=当前的标签
数据[:tags]=如果tags.present存在标签?
_调用(严重性、时间、程序名、数据)
结束
结束
请注意,\u调用
仅在基于Ougai的格式化程序
中有效