【问题标题】:Python logger not respecting setLevel?Python记录器不尊重setLevel?
【发布时间】:2013-05-18 13:18:12
【问题描述】:

我花了一些时间浏览网站上的 Python 记录器问题,希望我的问题能在那里得到解决。我已经设置了一个记录器,其中包含两个流处理程序,它们具有不同的格式和日志记录级别,这是我的代码库中的一个功能性 sn-p:

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

我希望在控制台中看到statuserrorwarn。然后在日志中statuserrorwarninfo。但是,尽管为文件处理程序选择了logging.INFOLOG_LEVELS 列表中的键 2),但我在控制台和日志文件中都只能看到 warn。这是预期的吗?

我在构建记录器时没有使用basicConfig 或其他任何东西,为什么我不能拥有这两个自定义级别?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    显然,logging.NOTSET 并不意味着“所有级别”,而是默认值。因此,将父记录器设置为级别 0 只会将其恢复为默认接受的级别。话虽如此,如果我将 logger.setLevel 设置为 logging.DEBUG,这实际上将日志记录设置为接受所有级别,然后将过滤传递给各种处理程序以进一步过滤。

    为了解决这个问题(以及潜在的自定义日志级别),我将初始记录器级别设置为 1

    【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 2017-08-23
    • 2023-03-13
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多