2013-07-09 76 views
46

我现在的格式字符串:如何将自定义字段添加到Python日志格式字符串?

formatter = logging.Formatter('%(asctime)s : %(message)s') 

,我想添加一个名为APP_NAME新的领域,这将在包含此格式每个脚本不同的值。

import logging 
formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s') 
syslog.setFormatter(formatter) 
logger.addHandler(syslog) 

但我不知道如何说app_name值传递给记录器插入格式字符串。我显然可以让它出现在日志消息中,但每次都会传递它,但这很麻烦。

我已经试过:

logging.info('Log message', app_name='myapp') 
logging.info('Log message', {'app_name', 'myapp'}) 
logging.info('Log message', 'myapp') 

但没有工作。

+0

你真的想把这个传递给每个'log'调用吗?如果是这样,请查看[文档](http://docs.python.org/3.3/library/logging.html#logrecord-objects),其中提到“此功能可用于将自己的值注入到LogRecord中...... “但是,这似乎是使用logger = logging.getLogger('myapp')'的一个主要情况,并将其烧录到'logger.info'调用中。 – abarnert

回答

65

你可以使用一个LoggingAdapter,所以你不必通过与每一个日志调用额外的信息:

import logging 
extra = {'app_name':'Super App'} 

logger = logging.getLogger(__name__) 
syslog = logging.StreamHandler() 
formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s') 
syslog.setFormatter(formatter) 
logger.setLevel(logging.INFO) 
logger.addHandler(syslog) 

logger = logging.LoggerAdapter(logger, extra) 
logger.info('The sky is so blue') 

日志(像)

2013-07-09 17:39:33,596 Super App : The sky is so blue 

Filters也可以用来添加上下文信息。

import logging 

class AppFilter(logging.Filter): 
    def filter(self, record): 
     record.app_name = 'Super App' 
     return True 

logger = logging.getLogger(__name__) 
logger.addFilter(AppFilter()) 
syslog = logging.StreamHandler() 
formatter = logging.Formatter('%(asctime)s %(app_name)s : %(message)s') 
syslog.setFormatter(formatter) 
logger.setLevel(logging.INFO) 
logger.addHandler(syslog) 

logger.info('The sky is so blue') 

产生类似的日志记录。

+1

我们如何在'config.ini'文件中指定?我想添加当前的主机名'socket.gethostname()'。 –

16

您需要将dict作为参数传递给extra,才能这样做。

logging.info('Log message', extra={'app_name': 'myapp'}) 

证明:

>>> import logging 
>>> logging.basicConfig(format="%(foo)s - %(message)s") 
>>> logging.warning('test', extra={'foo': 'bar'}) 
bar - test 

此外,作为一个说明,如果你尝试登录的消息,而没有经过快译通,那么它就会失败。

>>> logging.warning('test') 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/logging/__init__.py", line 846, in emit 
    msg = self.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 723, in format 
    return fmt.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 467, in format 
    s = self._fmt % record.__dict__ 
KeyError: 'foo' 
Logged from file <stdin>, line 1 
+1

救了我一天:) – Anish

+0

这也适用于'logging.info()'?我最后一次尝试时失败了。 :/ –

+0

我喜欢@ mr2ert的答案。如果不是hasattr(记录,'foo'),则可以通过扩展'logging.Formatter'类给默认值赋予额外字段: class CustomFormatter(logging.Formatter): def format(self,record): : record.foo = 'default_foo' 返回超级(的CustomFormatter,self.format(记录) H = loggin.StreamHandler() h.setFormatter(的CustomFormatter( '%(富)S%(消息)S') 记录器= logging.getLogger( '巴') logger.addHandler(H) logger.error(,额外= { '富': 'FOO'} '哎!') logger.error('哎! ') – loutre

相关问题