我花了一些时间在Python记录器上查看网站问题,希望我能在那里得到解决.我已经设置了一个带有两个流处理程序的记录器,它们具有不同的格式和级别的日志记录,这是我的代码库中的功能代码段:
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
Run Code Online (Sandbox Code Playgroud)
我一直在使用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')
Run Code Online (Sandbox Code Playgroud)
我希望看到status,error和warn在控制台中.然后status,error,warn并info在日志中.但是,我只warn在控制台和日志文件中看到,尽管为文件处理程序选择了logging.INFO(LOG_LEVELS列表中的键2 ).这是预期的吗?
basicConfig在构建记录器时我没有使用或其他任何东西,为什么我不能拥有这两个自定义级别?
显然,logging.NOTSET并不意味着“所有级别”,而是默认值。因此,将父记录器设置为级别 0 只会将其恢复到默认接受的级别。话虽这么说,如果我将 logger.setLevel 设置为logging.DEBUG实质上将日志记录设置为接受所有级别,然后将过滤传递给各种处理程序以进一步过滤。
为了解决这个问题(以及潜在的自定义日志级别),我将初始记录器级别设置为 1