【问题标题】:Logging not displaying debug level when level is set by dictConfig当 dictConfig 设置级别时,日志记录不显示调试级别
【发布时间】:2022-02-04 11:56:52
【问题描述】:

编辑:我发现了问题,但我不完全确定它为什么会这样做。

问题在于LOGGING_CONFIG['handlers']['default']['level']。如果我删除该密钥,那么我将获得所需的功能,但我不知道为什么它没有被my_package.module.logger 记录器覆盖。对此的解释将不胜感激。


我正在尝试为我正在创建的包创建一个日志记录模块,但我并不真正了解 python logging 配置字典,因此,我无法解决我遇到的问题,其中级别logger 应该打印调试消息,但不是。我有以下结构:

my_package
    |
    |-----__init__.py
    |-----module
    |       |
    |       |-----__init__.py
    |       |-----logger.py
    |       |-----run_me.py

logger.py 看起来像这样:

import logging
import logging.config

LOGGING_CONFIG = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level': 'INFO',
            'formatter': 'standard',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',  # Default is stderr
        },
    },
    'loggers': {
        '': {  # root logger
            'handlers': ['default'],
            'level': 'WARNING',
            'propagate': False
        },
        'my_package.module.logger': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': False
        },
        '__main__': {  # if __name__ == '__main__'
            'handlers': ['default'],
            'level': 'INFO',
            'propagate': False
        },
    }
}

logging.config.dictConfig(LOGGING_CONFIG)

log = logging.getLogger(__name__)
log.warning('Configured for Warnings')
log.debug('Configured for Debug')
log.info('Configured for Info')

这里是run_me.py

import my_package.module.logger

如果我直接运行logger.py,我会得到预期的输出

> TIME [WARNING] __main__: Configured for Warnings
> TIME [INFO] __main__: Configured for Info

但如果我运行 run_me.py,我似乎没有得到预期的输出 - 缺少调试级别信息:

> TIME [WARNING] my_package.module.logger: Configured for Warnings
> TIME [INFO] my_package.module.logger: Configured for Info

如果我将LOGGING_CONFIG 中的记录器名称从my_package.module.logger 更改为my_package.module,问题仍然存在,我认为应该捕获模块目录中的任何内容。

如果我从配置字典中删除 __main__ 记录器,我也会在直接运行 logger.py 时得到预期的行为 - 它只显示警告输出。

为什么调试级别没有出现,尽管它已明确设置?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    处理程序的级别设置为 INFO,它不会打印任何 DEBUG 消息。

    'handlers': {
        'default': {
            'level': 'INFO', <-------- here
    

    【讨论】:

    • 那么处理程序配置会覆盖单个记录器配置吗?处理程序具有更高的优先级?只是试图理解答案。我可以看到它的解决方案,但不是为什么它的解决方案。
    • 记录器和处理程序都有其级别(阈值)。消息从记录器通过一个或多个处理程序到达其目的地,并且必须满足每一步的级别。想象一个记录器,其中一个流处理程序配置为打印每条消息,一个电子邮件 (SMTP) 处理程序仅向管理员发送严重错误的电子邮件。 Python 日志记录可以定制很多,以匹配几乎所有可能的用例。参考日志教程,也可以参考docs.python.org/3/howto/index.html的食谱
    【解决方案2】:

    我不熟悉您使用的格式,我使用的是以下格式,它总是适合我:

    logging.basicConfig(
         filename = 'c:\\logs\\XXXX.log',
         level = logging.DEBUG,
         format = '[XXX] %(levelname)-7.7s %(message)s'# )
    

    【讨论】:

    • 我使用的格式是 configDict,据我所知,在 python 3.6+ 中,它是设置日志配置的首选方式。但我不太确定很多日志记录功能!
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多