2011-03-17 15 views
3

我想包括调用记录在日志输出的类别,如名称:log4r的 - 包括在日志输出类名

[MyClass] here is the message 

我见过使用的选项Contexts但我不希望有做这样的事情在我的应用程序,当我登录的东西(记住,我想在每一个日志消息类名):

NDC.push('class:' + self.class.name) 
logger.debug 'hello' 

我想只是电话:

logger.debug 'hello' 

有什么建议吗?

回答

8

使用环境是最好的,但你可以使用自己的格式(见Log4r formatters

logger = Logger.new 'test' 
outputter = Outputter.stdout 
outputter.formatter = PatternFormatter.new(:pattern => "%l - kittens - %m") 
logger.outputters = outputter 
logger.info 'adorable' # => INFO - kittens - adorable 

或者,实际上,因为你想让它引用self.class我的建议实际上会创建一个日志模块的工作原理像这样:

module Logging 
    def logger 
    return @logger if @logger 
    @logger = Logger.new 'test' 
    outputter = Outputter.stdout 
    outputter.formatter = PatternFormatter.new(:pattern => "%l - #{self.class} - %m") 
    @logger.outputters = outputter 
    @logger 
    end 
end 

class HasLogging 
    include Logging 

    def test 
    logger.info 'adorable' 
    end 
end 

test = HasLogging.new 
test.test # => INFO - HasLogging - adorable 

可能不完全是这样,但你明白了。

+0

这就是我在找的东西,虽然我稍微修改了它来设置记录器名称等于'self.class.name',然后在输出器格式中使用'%C'而不是'self.class.name' – codecraig 2011-03-17 12:02:17

+1

就是那种精神。我想你会在几个类中使用它,并使用相同的Logger实例,它不会更新您为Logger设置的名称。 – 2011-03-17 12:44:00

+1

这将为包含**的每个类创建一个记录器**,并且仅在您使用该模块中的模块和方法并将该模块包含在类中时才起作用。该方法将被“转移”到类中,当然,当它被称为“self.class”时,将返回该类的名称。一个人不应该使用这个解决方案(但是我不会不幸地想到另一个)。 – phikes 2014-03-03 16:36:24