0

我可以用 log4r 定义我自己的日志级别:

require 'log4r'
require 'log4r/configurator'

# This is how we specify our levels
Log4r::Configurator.custom_levels "Foo", "Bar", "Baz"

log = Log4r::Logger.new('custom levels')
p log.levels  #-> ["ALL", "Foo", "Bar", "Baz", "OFF"]
log.add Log4r::StdoutOutputter.new('console')

puts log.foo? #-> true
log.foo "This is foo 1"

log.level = Log4r::Bar
puts log.foo? #->false
log.foo "This is foo 2"

log4r文档说:

此外,应该在使用 Log4r 完成任何其他操作之前设置自定义级别,否则将加载默认级别。

这种限制是两个问题的根源:

  • Log4r::Configurator.custom_levels如果没有定义记录器,则仅设置新级别。
  • 如果我在定义自己的级别后创建另一个记录器,我会再次获得自定义级别。

问题1:

例子:

require 'log4r'
require 'log4r/configurator'

#Create a dummy logger
Log4r::Logger.new('dummy')

# Define new levels -> does not work after creation of another logger.
Log4r::Configurator.custom_levels "Foo", "Bar", "Baz"
log = Log4r::Logger.new('custom levels')
p log.levels  #-> ["ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "OFF"]

不使用自定义级别。

问题 2

如果我定义自己的级别,我就不可能回到默认值。

例子:

require 'log4r'
require 'log4r/configurator'

# Define customer levels
Log4r::Configurator.custom_levels "Foo", "Bar", "Baz"
Log4r::Logger.new('dummy with custom levels')

#Reset to standard levels ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"] <- this does not work
Log4r::Configurator.custom_levels( *Log4r::Log4rConfig::LogLevels )
log2 = Log4r::Logger.new('log')
p log2.levels #-> ["ALL", "Foo", "Bar", "Baz", "OFF"], but I wanted ["DEBUG", "INFO", "WARN", "ERROR", "FATAL"]

背景:

我想创建一个具有我自己的级别的记录器,类似于 Apache : DEBUG INFO NOTICE WARN ERROR CRIT ALERT EMERG

当我这样做时,我遇到了两个问题:

  • 如果另一个应用程序也使用 log4r,则该应用程序没有致命级别。这可以解决,如果我在我的应用程序中添加一个致命级别。
  • 如果在我的应用程序之前加载另一个应用程序并创建记录器,我的应用程序将失败,因为我的客户级别不可用。

我的问题:

如何创建具有自定义日志级别且对其他记录器没有副作用的记录器?

4

1 回答 1

1

自定义级别是整个流程的,您无法在设置后重置它。但是可能有一些方法可以实现你想要的。

问题 1

必须设置以前的自定义级别是有原因的,并且在设置自定义级别期间会创建记录器方法和输出器方法,因此如果您要删除一些可能导致意外错误的自定义级别,您应该小心。

但是,有一种解决方法可以从我的 Log4r 分支中重置自定义级别,并且它是出于测试目的。(此方法将 log4r 重置为原始状态,清除所有现有的记录器和输出器)

问题 2

解决冲突有两种解决方案:

  • 在其他模块之前定义所有自定义级别。并且您必须包括所有自定义级别。例如['Foo', 'Bar', 'Bing', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']
  • 如果您无法在其他模块之前执行此操作,请使用上述方法重置 log4r 并重新定义自定义级别,并在需要时从其他模块加载配置
  • 使用以下别名方法并相应地更改您的 log4r 配置(例如,将 foo 替换为 debug 等)
Log4r::Logger.module_eval %{
  alias_method :foo, :debug
  alias_method :bar, :info
  alias_method :baz, :error
  alias_method :qux, :fatal
}

希望能帮助到你。

于 2015-01-07T10:10:34.300 回答