我可以用 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,则该应用程序没有致命级别。这可以解决,如果我在我的应用程序中添加一个致命级别。
- 如果在我的应用程序之前加载另一个应用程序并创建记录器,我的应用程序将失败,因为我的客户级别不可用。
我的问题:
如何创建具有自定义日志级别且对其他记录器没有副作用的记录器?