2013-07-09 127 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

相關問題