Python日志配置异常:Info输出控制台/Warning等输出文件出错
Python logging 日志分流问题修复
你的代码出现两个问题:文件日志串流到控制台、控制台日志重复,根源都是logging默认的日志传播机制——所有子logger的日志默认会向上传递给父级logger(也就是根logger),而根logger默认自带一个输出到控制台的StreamHandler,所以会额外输出一遍日志。
错误原因拆解
- 文件日志出现在控制台:
file_log这个子logger的WARNING日志会传播到根logger,根logger的默认StreamHandler把它输出到了控制台。 - 控制台日志重复:
console_log的INFO日志不仅自己的StreamHandler输出一次,还会传给根logger的StreamHandler再输出一次,所以重复了。
修复方案1:关闭子logger的日志传播
给两个子logger加上propagate = False,阻止日志向上传递到根logger:
import logging console_log = logging.getLogger("CONSOLE") console_log.setLevel(logging.INFO) console_log.propagate = False # 关闭日志传播 stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.INFO) console_log.addHandler(stream_handler) file_log = logging.getLogger("FILE") file_log.setLevel(logging.WARNING) file_log.propagate = False # 关闭日志传播 file_handler = logging.FileHandler('log.txt') file_handler.setLevel(logging.WARNING) file_log.addHandler(file_handler) def log_to_console(message): console_log.info(message) def log_to_file(message): file_log.warning(message) log_to_console("THIS SHOULD SHOW ONLY IN CONSOLE") log_to_file("THIS SHOULD SHOW ONLY IN FILE")
修复方案2:更简洁的单logger多handler配置
其实没必要创建两个独立logger,用一个logger同时挂载控制台和文件两个handler,分别设置级别即可,逻辑更清晰:
import logging # 初始化自定义logger logger = logging.getLogger("APP_LOG") logger.setLevel(logging.INFO) # 总级别设为最低的INFO,确保所有符合条件的日志能被handler处理 logger.propagate = False # 关闭传播避免根logger重复输出 # 控制台handler:仅处理INFO及以上级别日志 stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.INFO) logger.addHandler(stream_handler) # 文件handler:仅处理WARNING及以上级别日志 file_handler = logging.FileHandler('log.txt') file_handler.setLevel(logging.WARNING) logger.addHandler(file_handler) # 测试日志输出 logger.info("THIS SHOULD SHOW ONLY IN CONSOLE") logger.warning("THIS SHOULD SHOW ONLY IN FILE") logger.error("THIS SHOULD ALSO SHOW IN FILE") logger.critical("THIS SHOULD ALSO SHOW IN FILE")
修改后,INFO日志只会输出到控制台,WARNING、ERROR、CRITICAL级别日志仅写入文件,不会再出现串流和重复的问题。
内容的提问来源于stack exchange,提问作者Tiago Silveira
相关产品推荐
相关产品推荐

