为什么在python中动态更改日志级别不起作用

2024-09-29 21:59:16 发布

您现在位置:Python中文网/ 问答频道 /正文

动态更改日志级别不起作用

import logging

logger = logging.Logger("MyLogger", level=logging.INFO)
formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
console = logging.StreamHandler()
console.setFormatter(formatter)
logger.addHandler(console)

logger.setLevel("INFO")
logger.info("should show up")
logger.setLevel(logging.CRITICAL)
logger.info("should not show up")

输出

MyLogger - INFO - should show up
MyLogger - INFO - should not show up

有什么建议我做错了什么


Tags: importinfoformatterloggingshownot动态logger
2条回答

要更改日志记录级别,您需要在父级处理程序上更改它:

level = logging.CRITICAL
logger.setLevel(level)
for handler in logger.handlers:
    handler.setLevel(level)

另一个答案是“工作”,但在这里并不能说明全部情况。答案声称您需要更改记录器的处理程序,这是不正确的

事实上,有两种setLevel方法(在记录器和处理程序上)记录器中设置的级别确定将传递给其处理程序的消息的严重性。每个处理程序中设置的级别决定处理程序将发送哪些消息。在正常使用中,仅将其中一个设置为“关键”就足以过滤该信息事件

它在您的情况下不起作用,因为没有在documented way中创建记录器:

Note that Loggers should NEVER be instantiated directly, but always through the module-level function logging.getLogger(name).

使用logging.Logger(...)创建记录器绕过了日志模块的全局状态,并破坏了日志树的层次结构。具体地说,它导致^{}返回一个错误缓存的结果

如果以常规方式创建,则在记录器实例上设置级别将不会影响处理程序:

import logging

# logger = logging.Logger("MyLogger", level=logging.INFO)  # no
logger = logging.getLogger("MyLogger")  # yes

formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
console = logging.StreamHandler()
console.setFormatter(formatter)
logger.addHandler(console)

logger.setLevel("INFO")
logger.info("should show up")
logger.setLevel(logging.CRITICAL)
logger.info("should not show up")

相关问题 更多 >

    热门问题