2012-08-05 13 views
22

Ich habe den folgenden Code läuft auf jede Anforderung eines wsgi (web2py) Anwendung:Ersetzen Standard-Handler von Python-Logger

import logging, logging.handlers 
from logging import StreamHandler, Formatter 

def get_configured_logger(name): 

    logger = logging.getLogger(name) 

    if (len(logger.handlers) == 0): 
     # This logger has no handlers, so we can assume it hasn't yet been configured (Django uses similiar trick) 

     # === Configure logger === 

     # Create Formatted StreamHandler: 
     FORMAT = "%(process)s %(thread)s: %(message)s" 
     formatter = logging.Formatter(fmt=FORMAT) 
     handler = logging.StreamHandler() 
     handler.setFormatter(formatter) 
     logger.addHandler(handler) 
     logger.setLevel(logging.DEBUG) 
     logger.debug('CONFIGURING LOGGER') 

    return logger 

# Get app specific logger: 
logger = get_configured_logger(request.application) 
logger.debug("TEST") 

Es soll den Logger einmal konfigurieren, mit dem formatierten Handler ich will. Es funktioniert, außer, dass ich erhalte doppelte Einträge in meinem stdout:

81893 4329050112: CONFIGURING LOGGER 
DEBUG:dummy:CONFIGURING LOGGER 
81893 4329050112: TEST 
DEBUG:dummy:TEST 

Wie kann ich eine neue formatiert Handler und loszuwerden/verstecken Standard ein?

+0

Ich habe diese Klasse nie zuvor verwendet, aber denken Sie nicht, dass logger.setLevel (logging.DEBUG) und logger.debug eine Art redundant ist? – MiJyn

+1

lkjoel- Nein, das sind zwei verschiedene Dinge. Das Aufrufen von '.debug (..)' erstellt Protokolleinträge auf der Debug-Ebene, während die Protokollierungsebene dem Handler mitteilt, * Protokolleinträge auf dieser Ebene * zu behandeln. – Yarin

+0

Nennen Sie 'logging.basicConfig' irgendwo? Wenn ja, kommentieren Sie das aus. – unutbu

Antwort

35

Vielleicht hilft das folgende Beispiel. Grundsätzlich können Sie entweder die Handler des Loggers entfernen, die Sie deaktivieren möchten, oder nicht mit dem Logger, von dem Sie sich abmelden.

$ cat testlog.py 
import logging 
logging.basicConfig(filename='foo', level=logging.DEBUG) 
root_logger = logging.getLogger() 
root_logger.debug('bar') 

my_logger = logging.getLogger('my_logger') 
FORMAT = "%(process)s %(thread)s: %(message)s" 
formatter = logging.Formatter(fmt=FORMAT) 
handler = logging.StreamHandler() 
handler.setFormatter(formatter) 

my_logger.addHandler(handler) 
my_logger.setLevel(logging.DEBUG) 
my_logger.info('baz') 

my_logger.propagate = False 
my_logger.info('foobar') 

my_logger.propagate = True 
my_logger.info('foobaz') 
root_logger.handlers = [] 
my_logger.info('barbaz') 

$ python testlog.py 
5927 140735224465760: baz 
5927 140735224465760: foobar 
5927 140735224465760: foobaz 
5927 140735224465760: barbaz 

$ cat foo 
DEBUG:root:bar 
INFO:my_logger:baz 
INFO:my_logger:foobaz 
+7

Derek-setting 'logger.propagate = False' war alles was ich brauchte- danke! – Yarin