Python多级日志配置异常:仅生成info日志文件
问题原因
你当前的写法存在核心问题:多次import logging as xxx只是给同一个logging模块起了不同别名,本质还是同一个模块对象。而logging.basicConfig()函数的特性是仅在根日志器未配置任何Handler时才会生效,后续调用都会被直接忽略。你的代码里最后调用的是infoLog.basicConfig(),所以只有info.log的配置生效,之前的error和warning配置都被跳过了。
正确实现方式
要实现不同级别日志分文件输出,需要为每个级别单独创建FileHandler,并绑定到日志器上。具体步骤如下:
- 创建日志器实例(可以用根日志器,也可以自定义)
- 为每个目标日志文件创建
FileHandler,并设置对应的日志级别 - 为每个Handler配置日志格式
- 将所有Handler添加到日志器中
下面是完整的可运行代码:
import logging # 获取根日志器(也可以用logging.getLogger("ProFilCar")自定义日志器) logger = logging.getLogger() logger.setLevel(logging.INFO) # 设置日志器的最低级别,确保所有目标级别都能被处理 # 移除默认的控制台Handler,避免重复输出 for handler in logger.handlers[:]: logger.removeHandler(handler) # 配置ERROR级别日志到error.log error_handler = logging.FileHandler('error.log') error_handler.setLevel(logging.ERROR) error_formatter = logging.Formatter('%(asctime)s - ProFilCar - %(levelname)s - %(message)s') error_handler.setFormatter(error_formatter) logger.addHandler(error_handler) # 配置WARNING级别日志到warning.log warning_handler = logging.FileHandler('warning.log') warning_handler.setLevel(logging.WARNING) warning_formatter = logging.Formatter('%(asctime)s - ProFilCar - %(levelname)s - %(message)s') warning_handler.setFormatter(warning_formatter) logger.addHandler(warning_handler) # 配置INFO级别日志到info.log info_handler = logging.FileHandler('info.log') info_handler.setLevel(logging.INFO) info_formatter = logging.Formatter('%(asctime)s - ProFilCar - %(levelname)s - %(message)s') info_handler.setFormatter(info_formatter) logger.addHandler(info_handler) # 测试代码 logger.info("这是一条INFO日志") logger.warning("这是一条WARNING日志") logger.error("这是一条ERROR日志")
关键细节说明
- 日志器的级别要设置为所有目标级别中最低的(这里是INFO),这样更低级别的日志才会被传递到Handler
- 默认情况下,每个
FileHandler会记录自身级别及以上的日志:比如ERROR级别的Handler只会处理ERROR及以上级别(这里只有ERROR),WARNING Handler处理WARNING和ERROR,INFO Handler处理INFO、WARNING、ERROR - 如果想让每个文件只记录对应级别的日志(比如warning.log只存WARNING,不存ERROR),可以给Handler添加
Filter,示例如下:
class LevelFilter(logging.Filter): def __init__(self, level): self.level = level def filter(self, record): return record.levelno == self.level # 给warning_handler添加过滤器,只保留WARNING级别 warning_handler.addFilter(LevelFilter(logging.WARNING)) # 给error_handler添加过滤器,只保留ERROR级别 error_handler.addFilter(LevelFilter(logging.ERROR)) # 给info_handler添加过滤器,只保留INFO级别 info_handler.addFilter(LevelFilter(logging.INFO))
添加这个过滤器后,每个日志文件就只会存储对应级别的日志内容了。
内容的提问来源于stack exchange,提问作者Maya_Cent
相关产品推荐
相关产品推荐

