【问题标题】:Log4r - include class name in log outputLog4r - 在日志输出中包含类名
【发布时间】:2011-03-17 11:16:38
【问题描述】:

我想在日志输出中包含调用记录器的类的名称,例如:

[MyClass] here is the message

我已经看到使用 Contexts 的选项,但我不想在我记录内容时在整个应用程序中执行类似的操作(请记住,我希望在每条日志消息中都使用类名) :

NDC.push('class:' + self.class.name)
logger.debug 'hello'

我只想打个电话:

logger.debug 'hello'

有什么建议吗?

【问题讨论】:

    标签: ruby log4r


    【解决方案1】:

    最好使用上下文,但您可以使用自己的格式化程序(请参阅Log4r formatters

    logger = Logger.new 'test'
    outputter = Outputter.stdout
    outputter.formatter = PatternFormatter.new(:pattern => "%l - kittens - %m")
    logger.outputters = outputter
    logger.info 'adorable' # => INFO - kittens - adorable
    

    或者,实际上,因为您希望它引用 self.class,我的建议实际上是创建一个像这样工作的 Logging 模块:

    module Logging
      def logger
        return @logger if @logger
        @logger = Logger.new 'test'
        outputter = Outputter.stdout
        outputter.formatter = PatternFormatter.new(:pattern => "%l - #{self.class} - %m")
        @logger.outputters = outputter
        @logger
      end
    end
    
    class HasLogging
      include Logging
    
      def test
        logger.info 'adorable'
      end
    end
    
    test = HasLogging.new
    test.test # => INFO - HasLogging - adorable
    

    可能不完全一样,但你明白了。

    【讨论】:

    • 这就是我要找的东西,虽然我稍微修改了它以将记录器名称设置为等于“self.class.name”,然后在输出器格式中使用“%C”而不是“self.class”。类名'
    • 这就是精神。我想你会在几个类中使用它并使用同一个 Logger 实例,这不会更新你为 Logger 设置的名称。
    • 这将为包含它的每个类创建一个记录器,并且仅在您使用模块和该模块中的方法并将该模块包含在一个类中时才有效.该方法将被“转移”到类中,当然当它被调用时self.class 返回该类的名称。不应该使用这个解决方案(但不幸的是我没有想出另一个)。
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2014-11-17
    • 2020-07-13
    • 2013-06-13
    • 2020-01-06
    • 2012-02-06
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多