2013-05-18 16 views
5

Spędziłem trochę czasu, przeglądając stronę w pytaniach rejestratora Pythona, mając nadzieję, że mój problem zostanie rozwiązany. Wcześniej skonfigurować rejestrator z dwoma obsługą strumieni, które mają zarówno różne formaty i poziomów rejestrowania, tutaj jest funkcjonalny fragment z mojego kodzie:Logger Pythona nie respektujący 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 

Byłem przy użyciu argparse karmić, ale do testowania cele jeśli karmisz do następujących funkcji:

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

bym się spodziewać status, error, a warn w konsoli. Następnie w dzienniku są status, error i. Jednak w pliku konsoli i pliku logu widzę tylko warn, pomimo wybrania logging.INFO (klucz 2 na liście LOG_LEVELS) dla obsługi plików. Czy to jest oczekiwane?

Nie używam basicConfig ani niczego innego podczas budowania programu rejestrującego, dlaczego nie mogę mieć tych dwóch niestandardowych poziomów?

Odpowiedz

2

Najwyraźniej logging.NOTSET nie oznacza "Wszystkie poziomy", ale raczej domyślne. Zatem ustawienie nadrzędnego programu rejestrującego na poziomie 0 powoduje jedynie przywrócenie go do domyślnych akceptowanych poziomów. To powiedziawszy, jeśli ustawię logger.setLevel na logging.DEBUG, który zasadniczo ustawia rejestrowanie, aby zaakceptować WSZYSTKIE poziomy, następnie przekazuje filtrowanie do różnych procedur obsługi w celu dalszego filtrowania.

Aby obejść ten problem (i potencjalnych poziomów zwyczaj dziennika) Mam ustawić początkowy poziom rejestratora do 1

+0

Jest to wyjaśnione w sposób bardziej szczegółowy w https://docs.python.org/2/library/logging .html # logging.Logger.setLevel – user545424

Powiązane problemy