2012-08-05 13 views
22

Ho il seguente codice in esecuzione su ogni richiesta di un WSGI (web2py) applicazione:Sostituire gestore predefinito di 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") 

E 'pensata per configurare il logger una volta, con il gestore formattato che voglio. Funziona, tranne che sto ricevendo doppie voci nella mia stdout:

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

Come posso utilizzare il mio nuovo gestore formattato e sbarazzarsi di/nascondere quello di default?

+0

Non ho mai usato questa classe prima, ma non pensate che logger.setLevel (logging.DEBUG) e logger.debug sia una sorta di ridondante? – MiJyn

+1

lkjoel- No, sono due cose diverse. chiamare '.debug (..)' crea voci di registro a livello di debug, mentre l'impostazione del livello di registrazione dice al gestore di * gestire * le voci di registro a quel livello. – Yarin

+0

Stai chiamando 'logging.basicConfig' ovunque? Se è così, commentalo. – unutbu

risposta

35

Forse l'esempio seguente sarà d'aiuto. Fondamentalmente puoi rimuovere i gestori del logger che desideri disattivare o non propagare con il logger da cui stai effettuando la registrazione.

$ 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' era tutto ciò di cui avevo bisogno- grazie! – Yarin

Problemi correlati