Python日志问题:INFO级日志未写入文件,ERROR日志重复输出
Python日志初始化问题的错误分析与修正
问题根源
你遇到的两个问题,本质是日志系统的级别过滤逻辑和处理器规则没设置正确:
- 仅ERROR级日志写入文件:默认情况下,logger的级别是
logging.WARNING,会直接过滤掉INFO级别的日志,导致INFO处理器根本接收不到日志内容。 - ERROR级日志同时出现在两个文件:INFO级别包含所有比它高的级别(ERROR、CRITICAL),所以设置了
level=INFO的处理器会自动处理ERROR日志,没有做级别范围限制。
关键修正步骤
1. 降低logger的全局级别
必须把logger的级别设置为logging.INFO(或更低的DEBUG),确保INFO及以上的日志能进入后续处理器环节。
2. 给INFO处理器添加级别过滤器
自定义一个过滤器,让INFO处理器只处理纯INFO级别的日志,排除ERROR及以上的日志。
3. 关闭日志传播(可选但推荐)
设置logger.propagate = False,避免日志向上传播到根logger,防止重复输出。
修正后的示例代码
import logging from logging.handlers import RotatingFileHandler # 自定义过滤器:只保留INFO级别日志 class InfoFilter(logging.Filter): def filter(self, record): return record.levelno == logging.INFO def initLogger(info_file=None, error_file=None, log_to_console=False): logger = logging.getLogger("custom_logger") # 清空已有处理器,避免重复初始化导致的重复输出 logger.handlers.clear() # 设置logger级别为INFO,确保INFO及以上日志能被处理 logger.setLevel(logging.INFO) # 关闭日志传播到根logger logger.propagate = False # 配置INFO日志处理器 if info_file: info_handler = RotatingFileHandler( info_file, maxBytes=10*1024*1024, # 10MB backupCount=5 ) info_handler.setLevel(logging.INFO) info_handler.addFilter(InfoFilter()) # 添加过滤器 info_formatter = logging.Formatter( "%(asctime)s - %(levelname)s - %(message)s" ) info_handler.setFormatter(info_formatter) logger.addHandler(info_handler) # 配置ERROR日志处理器 if error_file: error_handler = RotatingFileHandler( error_file, maxBytes=10*1024*1024, backupCount=5 ) error_handler.setLevel(logging.ERROR) error_formatter = logging.Formatter( "%(asctime)s - %(levelname)s - %(message)s - %(exc_info)s" ) error_handler.setFormatter(error_formatter) logger.addHandler(error_handler) # 配置控制台输出(可选) if log_to_console: console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) console_formatter = logging.Formatter( "%(levelname)s: %(message)s" ) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) return logger # 测试代码 if __name__ == "__main__": logger = initLogger(info_file="info.log", error_file="error.log") logger.info("这是一条INFO级日志") logger.error("这是一条ERROR级日志")
验证效果
运行测试代码后:
info.log中只会出现INFO级日志error.log中只会出现ERROR级日志- 不会出现日志丢失或重复写入的问题
内容的提问来源于stack exchange,提问作者GeekGeek4
相关产品推荐
相关产品推荐

