概括
我正在尝试使用SemanticLogger 4.10.0 作为 Ruby 3.1.1 应用程序中动态跟踪解决方案的一部分。但是,我似乎误解了有关如何或在何处访问SemanticLogger::Loggable应该在类上创建的记录器实例的一些东西,并且在从扩展类内部调用#logger_measure_method时出现 NameError 异常(如下所述),因为我似乎无法正确实现类扩展。
说明问题的代码
带有 CustomLogger 的模块
require 'json'
require 'semantic_logger'
module SomeGem
module CustomLogger
include SemanticLogger
class MyFormat < SemanticLogger::Formatters::Default
def call (log, logger, machine_name: nil, json: nil)
self.log = log
self.logger = logger
message = "[#{machine name}] #{message}" if machine_name
payload = JSON.parse(json)
[time, level, process.info, tags, named.tags, duration, name, message, payload, exception].compact!
end
end
def self.extended(klass)
prepend SemanticLogger, SemanticLogger::Loggable, SemanticLogger::Loggable::ClassMethods
SemanticLogger.default_level = :debug
SemanticLogger.add_appender(file_name: "/dev/stderr", formatter: SomeGem::CustomLogger::MyFormat.new,
level: :warn, filter: proc { %i[warn fatal unknown].include? _1.level }
)
SemanticLogger.add_appender(file_name: "/dev/stdout", formatter: SomeGem::CustomLogger::MyFormat.new,
level: :trace, filter: proc { %i[trace debug info error].include? _1.level }
)
define_method(:auto_measure_method_calls) do
public_instance_methods(false).
reject { _1.to_s.match? /^logger/ }.
each { logger_measure_method _1, level: :trace }
end
end
end
end
由 CustomLogger 扩展的模块
module SomeGem
class Foo
extend CustomLogger
def alpha = 1
def beta = 2
def charlie = 3
auto_measure_method_calls if ENV['LOG_LEVEL'] == 'trace'
end
end
执行守则
ENV['LOG_LEVEL'] = 'trace'
f = SomeGem::Foo.new
pp f.alpha, f.beta, f.charlie
代码的问题和问题
我的问题是:
潜在的(可能是 X/Y)问题是我想干掉在我跟踪的每个类中包含SemanticLogger::Loggable和SemanticLogger::Loggable::ClassMethods的代码,并自动测量扩展类的方法开发中。
当我尝试使用旨在引入 SemanticLogger::Loggable 的模块来扩展类时,我似乎并不总是将记录器用作整个类的访问器。
我还担心将模块包含在多个类中会导致重复的附加程序被添加到#appenders数组中,无论它实际存储在哪里。
最重要的是,当我尝试通过扩展类来自动添加日志记录和方法测量时,我会收到如下错误:
~/.gem/ruby/3.1.1/gems/semantic_logger-4.10.0/lib/semantic_logger/loggable.rb:96:in `alpha': #SomeGem::Foo:0x00000001138f6a38 的未定义局部变量或方法`logger' (NameError) 来自 foo.rb:51:in `<main>'
我是否遗漏了一些关于如何使用 SemanticLogger 扩展类的明显内容?如果有更好的方法来完成我想做的事情,那就太好了!如果我做错了什么,理解那也很棒。如果这是一个错误,或者我使用错误的功能,这也是有用的信息。