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的
格式化程序
中有效