自定义Python Logger重复输出及日志级别配置异常问题
Python自定义Logger重复输出及级别配置问题解决
问题原因
重复输出
你遇到的重复日志,是因为Python logging的日志传播机制:自定义logger a 处理完日志后,会把日志传递给它的父级logger(也就是默认的root logger)。而root logger默认自带一个StreamHandler,所以同一条日志会被自定义handler和root的handler各输出一次——第一行是你自定义的格式,第二行是root logger的默认格式。
移除logger.setLevel后无输出
logger默认继承父级(root)的日志级别,root logger默认级别是WARNING。哪怕你给handler设置了DEBUG级别,但logger本身会先过滤掉低于WARNING的日志(比如INFO),这些日志根本到不了handler,所以程序完全没输出。
解决方法
1. 关闭日志传播解决重复输出
在添加handler后,关闭自定义logger的传播特性,阻止日志传递给root logger:
logger.addHandler(console_handler) logger.propagate = False # 新增这行,关闭传播
2. 保留logger级别配置确保日志能输出
必须保留logger.setLevel(logging.DEBUG),它负责控制logger允许通过的最低日志级别,只有通过logger过滤的日志,才会传到handler再做二次过滤。如果不想用DEBUG,也可以根据需求设为INFO/WARNING等,但必须显式设置,避免继承root的高级别导致低级别日志被过滤。
修改后的完整代码片段
... args = parser.parse_args() if args.log: # Create custom logger logger = logging.getLogger('a') logger.setLevel(logging.DEBUG) # Create handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) # Create formatter and add it to handler console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console_handler.setFormatter(console_formatter) # Add handler to logger logger.addHandler(console_handler) logger.propagate = False # 关闭日志传播,解决重复输出 try: ... except IndexError as ie: logger.info(f'Test') ... except Exception as ex: logger.error(f'Exception: {ex}')
修改后输出就只会有一行自定义格式的日志:
2022-07-11 11:29:59,409 - INFO - Test
内容的提问来源于stack exchange,提问作者YTKme
相关产品推荐
相关产品推荐

