2013-05-18 73 views
5

我花了一點時間在Python日誌記錄器上查看網站,希望我的問題能在那裏解決。我設置了有兩個不同的格式和日誌記錄級別的兩個流處理器一個記錄器,這裏是從我的代碼庫的功能片段:Python記錄器不尊重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 

我一直在使用的argparse養活這一點,但是出於測試目的如果你給下面以功能:

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

我希望看到statuserror,並在控制檯warn。然後在日誌中輸入status,error,warninfo。但是,儘管在文件處理程序中選擇了logging.INFOLOG_LEVELS列表中的關鍵字2),但在控制檯和日誌文件中我只能看到warn。這是預期的嗎?

我在構建記錄器時沒有使用basicConfig或其他任何東西,爲什麼我不能擁有這兩個自定義級別?

回答

2

顯然,logging.NOTSET並不意味着「所有級別」,而是默認值。因此,將父級記錄器設置爲級別0只會將其恢復爲默認的可接受級別。也就是說,如果我將logger.setLevel設置爲logging.DEBUG,它基本上將日誌設置爲接受所有級別,然後將過濾傳遞給各個處理程序以進一步進行過濾。

爲了解決這個問題(和潛在的自定義日誌級別)我已經設置了初始記錄級別設置爲1

+0

這在https://docs.python.org/2/library/logging詳細解釋的.html#logging.Logger.setLevel – user545424