2013-07-09 13 views
46

Meine aktuelle Format-String ist:Wie füge ich dem Python-Protokollformat-String ein benutzerdefiniertes Feld hinzu?

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

und ich möchte ein neues Feld app_name und die haben einen anderen Wert in jedem Skript, das diesen Formatierer enthält genannt hinzuzufügen.

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

Aber ich bin nicht sicher, wie man den Logger, dass app_name Wert zu übergeben in das Format-String zu interpolieren. Ich kann es offensichtlich in der Protokollnachricht erscheinen lassen, aber es jedes Mal passieren, aber das ist chaotisch.

Ich habe versucht:

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

aber keine Arbeit.

+0

Möchten Sie das wirklich bei jedem "Log" -Ruf eingeben? Wenn ja, sehen Sie sich die [docs] (http://docs.python.org/3.3/library/logging.html#logrecord-objects) an, wo es heißt: "Diese Funktionalität kann verwendet werden, um Ihre eigenen Werte in einen LogRecord zu injizieren ... "Aber das scheint ein Hauptfall für die Verwendung von' logger = logging.getLogger ('myapp') 'zu sein und in den 'logger.info'-Aufruf eingebaut zu haben. – abarnert

Antwort

65

Sie könnten ein verwenden LoggingAdapter so haben Sie nicht die zusätzlichen Informationen mit jeder Protokollierung Anruf weitergeben müssen:

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') 

Protokolle (so etwas wie)

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

Filters kann auch verwendet werden, um kontextbezogene Informationen hinzuzufügen.

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') 

erzeugt einen ähnlichen Protokolleintrag.

+1

Wie können wir das in einer 'config.ini' Datei angeben? Ich möchte den aktuellen Hostnamen 'socket.gethostname()' hinzufügen. –

16

Sie müssen das Diktat als Parameter zu Extra übergeben, um es so zu machen.

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

Beweis:

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

Auch als Notiz, wenn Sie versuchen, eine Nachricht zu protokollieren, ohne die dict vorbei, dann wird es scheitern.

>>> 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

speicherte meinen Tag :) – Anish

+0

Wird dies auch für 'logging.info()' funktionieren? Es hat versagt, als ich zuletzt versuchte. :/ –

+0

Ich mag @ Mr2ert Antwort. Sie können dem zusätzlichen Feld einen Standardwert zuweisen, indem Sie die Klasse 'logging.Formatter' erweitern: Klasse CustomFormatter (logging.Formatter): def-Format (self, record): falls nicht hasattr (record, 'foo') : record.foo = 'default_foo' return Super (CustomFormatter, self.format (record) h = loggin.StreamHandler() h.setFormatter (CustomFormatter ('% (foo) s% (message) s') Logger = logging.getLogger ('bar') logger.addHandler (h) logger.error (extra = { 'foo': 'fOO'} 'hey!') logger.error ('hey! ') – loutre

Verwandte Themen