Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在python中动态更改日志级别不起作用_Python_Logging - Fatal编程技术网

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

为什么在python中动态更改日志级别不起作用,python,logging,Python,Logging,动态更改日志级别不起作用 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

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

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

有什么建议我做错了什么吗?

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

level = logging.CRITICAL
logger.setLevel(level)
for handler in logger.handlers:
    handler.setLevel(level)
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")
另一个答案是“工作”,但在这里并不能说明全部情况。答案声称您需要更改记录器及其处理程序,这是不正确的

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

它在您的情况下不起作用,因为未在以下位置创建记录器:

请注意,不应直接实例化记录器,而应始终通过模块级函数
logging.getLogger(name)

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

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

level = logging.CRITICAL
logger.setLevel(level)
for handler in logger.handlers:
    handler.setLevel(level)
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")

您应该使用
logging.basicConfig
来配置根记录器,其中包括设置级别和自动创建
StreamHandler