2013-05-18 21 views
5

Ho passato un po 'di tempo a guardare attraverso il sito le domande del logger Python sperando che il mio sarebbe stato risolto lì. Ho installato un logger con due gestori di flusso che hanno entrambi i formati e livelli di registrazione diversi, Ecco un frammento funzionale dalla mia base di codice:Il logger Python non rispetta setLevel?

import os 
import time 
import logging 

LOG_LEVELS = [logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG] 
TEST_RESULT_LEVELV_NUM = 51 

# http://stackoverflow.com/a/11784984/196832 
def status(self, message, *args, **kws): 
    self._log(TEST_RESULT_LEVELV_NUM, message, args, **kws) 

logging.addLevelName(TEST_RESULT_LEVELV_NUM, "RESULT") 
logging.Logger.result = status 


def setup_logging(level=0, quiet=False, logdir=None): 
    logger = logging.getLogger('juju-test') 
    ffmt = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s: %(message)s') 
    cfmt = logging.Formatter('%(name)s %(levelname)s: %(message)s') 
    #logger.setLevel(0) 

    if level >= len(LOG_LEVELS): 
     level = len(LOG_LEVELS) - 1 

    if logdir: 
     if not os.path.exists(logdir): 
      os.makedirs(logdir) 
     logfile = os.path.join(logdir, 'juju-test.%s.log' % int(time.time())) 
     fh = logging.FileHandler(logfile) 
     # Always at least log to INFO for file, unless DEBUG is requested 
     fh.setLevel(LOG_LEVELS[level if level >= 2 else 2]) 
     fh.setFormatter(ffmt) 
     logger.addHandler(fh) 

    if not quiet: 
     ch = logging.StreamHandler() 
     ch.setLevel(LOG_LEVELS[level]) 
     ch.setFormatter(cfmt) 
     logger.addHandler(ch) 

    return logger 

Sto usando un argparse per alimentare questo, ma per i test scopi se si alimentano la seguente alla funzione:

logger = setup_logging(level=1, logdir="/tmp/oofrab/") 
logger.info('Informative!') 
logger.warn('Whoa buddy!') 
logger.error('Look what you did.') 
logger.result("They told me not to make a custom logging level, I'll show them!") 
logger.debug('Lots of bugs, man') 

mi aspetto di vedere status, error, e warn nella console. Quindi status, error, warn e info nel registro. Tuttavia, vedo solo fino a warn in console e nel file di registro, nonostante selezioni logging.INFO (chiave 2 nell'elenco LOG_LEVELS) per il gestore file. È previsto?

Non sto usando basicConfig o altro durante la creazione del logger, perché non posso avere questi due livelli personalizzati?

risposta

2

Apparentemente, logging.NOTSET non significa "Tutti i livelli", ma piuttosto valori predefiniti. Pertanto, l'impostazione del registratore principale sul livello 0 lo ripristina solo ai livelli accettati di default. Detto questo, se ho impostato logger.setLevel su logging.DEBUG che essenzialmente imposta la registrazione per accettare TUTTI i livelli, quindi passa il filtraggio ai vari gestori per filtrare ulteriormente.

Per ovviare a questo (e potenziali livelli di log personalizzate) ho impostato il livello logger iniziale al 1

+0

Questo è spiegato più in dettaglio https://docs.python.org/2/library/logging .html # logging.Logger.setLevel – user545424

Problemi correlati