我可以用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创建一个记录器。
当我这样做的时候,我会遇到两个问题:
我的问题是:
如何创建具有自定义日志级别且对其他记录器没有副作用的记录器?
发布于 2015-01-07 10:10:34
自定义级别是进程范围的,您不能在它已经设置之后重新设置它。但也许有办法可以实现你想要的。
问题1
必须设置以前的自定义级别,并在设置自定义级别期间创建记录器方法和输出方法,因此,如果要删除可能导致意外错误的一些自定义级别,则应小心。
但是,有一个方法可以重置来自我的Log4r叉的自定义级别,这是针对试验目的的。(此方法将log4r重置为原始状态,清除所有现有的记录器和输出程序)
问题2
解决冲突有两种解决办法:
['Foo', 'Bar', 'Bing', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']Log4r::Logger.module_eval %{
alias_method :foo, :debug
alias_method :bar, :info
alias_method :baz, :error
alias_method :qux, :fatal
}希望能帮上忙。
https://stackoverflow.com/questions/20938416
复制相似问题