我可以使用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::Configurator.custom_levels
设置新级别。示例:
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"]
不使用自定义级别。
如果我定义自己的等级,我就不可能回到默认值。
示例:
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
。
当我这样做时,我遇到两个问题:
如何创建具有自定义日志级别且没有副作用的记录器 其他伐木工人?
答案 0 :(得分:1)
自定义级别是整个流程范围,您已经设置后无法重置它。但是可能有某种方法可以达到你想要的效果。
问题1
必须先设置以前的自定义级别,并在设置自定义级别时创建记录器方法和输出方法,因此如果要删除一些可能导致意外错误的自定义级别,请务必小心
但是,有一种解决方法可以从my fork of Log4r重置自定义级别,而test purpose也是如此。 (此方法将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
}
希望它有所帮助。