如何在不与其他log4r-loggers发生冲突的情况下在log4r中定义自己的级别?

时间:2014-01-05 19:58:10

标签: ruby logging log4r

我可以使用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-documentation说:

  

此外,应在使用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"]

背景

我想用自己的levels similar to Apache创建一个记录器: DEBUG INFO NOTICE WARN ERROR CRIT ALERT EMERG

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

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

我的问题:

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

1 个答案:

答案 0 :(得分:1)

自定义级别是整个流程范围,您已经设置后无法重置它。但是可能有某种方法可以达到你想要的效果。

问题1

必须先设置以前的自定义级别,并在设置自定义级别时创建记录器方法和输出方法,因此如果要删除一些可能导致意外错误的自定义级别,请务必小心

但是,有一种解决方法可以从my fork of Log4r重置自定义级别,而test purpose也是如此。 (此方法将log4r重置为原始状态,清除所有现有记录器和输出器)

问题2

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

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

希望它有所帮助。