0

概括

我正在尝试使用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

代码的问题和问题

我的问题是:

  1. 潜在的(可能是 X/Y)问题是我想干掉在我跟踪的每个类中包含SemanticLogger::LoggableSemanticLogger::Loggable::ClassMethods的代码,并自动测量扩展类的方法开发中。

  2. 当我尝试使用旨在引入 SemanticLogger::Loggable 的模块来扩展类时,我似乎并不总是将记录器用作整个类的访问器。

  3. 我还担心将模块包含在多个类中会导致重复的附加程序被添加到#appenders数组中,无论它实际存储在哪里

  4. 最重要的是,当我尝试通过扩展类来自动添加日志记录和方法测量时,我会收到如下错误:

    ~/.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 扩展类的明显内容?如果有更好的方法来完成我想做的事情,那就太好了!如果我做错了什么,理解那也很棒。如果这是一个错误,或者我使用错误的功能,这也是有用的信息。

4

0 回答 0