为什么在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
。