You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:47:04