首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不与其他log4r记录器发生冲突的情况下在log4r中定义自己的级别?

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

Stack Overflow用户
提问于 2014-01-05 19:58:09
回答 1查看 542关注 0票数 0

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

代码语言:javascript
复制
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:

示例:

代码语言:javascript
复制
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

如果我定义了自己的级别,我就不可能返回到缺省值。

示例:

代码语言:javascript
复制
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,则该应用程序没有致命级别.如果我在应用程序中添加致命级别,这是可以解决的。
  • 如果在我的应用程序之前加载了另一个应用程序并创建了一个记录器,我的应用程序将失败,因为我的客户级别不可用。

我的问题是:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-07 10:10:34

自定义级别是进程范围的,您不能在它已经设置之后重新设置它。但也许有办法可以实现你想要的。

问题1

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

但是,有一个方法可以重置来自我的Log4r叉的自定义级别,这是针对试验目的的。(此方法将log4r重置为原始状态,清除所有现有的记录器和输出程序)

问题2

解决冲突有两种解决办法:

  • 在其他模块之前定义所有自定义级别。您必须包括所有自定义级别。例如['Foo', 'Bar', 'Bing', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']
  • 如果在其他模块之前不能这样做,请使用上面的方法重置log4r并重新定义自定义级别,并在需要时从其他模块加载配置。
  • 使用别名方法,如下所示,并相应地更改log4r配置(例如,用调试替换foo,等等)
代码语言:javascript
复制
Log4r::Logger.module_eval %{
  alias_method :foo, :debug
  alias_method :bar, :info
  alias_method :baz, :error
  alias_method :qux, :fatal
}

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20938416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档