我花了一點時間在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')
我希望看到status
,error
,並在控制檯warn
。然後在日誌中輸入status
,error
,warn
和info
。但是,儘管在文件處理程序中選擇了logging.INFO
(LOG_LEVELS
列表中的關鍵字2),但在控制檯和日誌文件中我只能看到warn
。這是預期的嗎?
我在構建記錄器時沒有使用basicConfig
或其他任何東西,爲什麼我不能擁有這兩個自定義級別?
這在https://docs.python.org/2/library/logging詳細解釋的.html#logging.Logger.setLevel – user545424