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

Python中如何根据日志级别设置独立输出文件与行为?

解决方案

核心思路

  • 自定义延迟创建文件的FileHandler:彻底解决初始化就生成空文件的问题,只有当对应级别的日志实际写入时才创建文件
  • 单Logger+动态Handler配置:用一个主Logger统一管理,根据运行模式动态添加对应Handler,避免多Logger配置混乱
  • 分场景配置:区分调试模式和用户交付模式,精准匹配两种场景的日志输出需求

实现代码

1. 自定义延迟创建的FileHandler

import logging
import os

class LazyFileHandler(logging.FileHandler):
    def __init__(self, filename, mode='a', encoding=None):
        # 初始化时不创建文件,强制开启延迟模式
        super().__init__(filename, mode, encoding, delay=True)
        self.file_created = False

    def emit(self, record):
        if not self.file_created:
            # 第一次写入日志时才真正创建并打开文件
            self.stream = self._open()
            self.file_created = True
        super().emit(record)

2. 日志配置函数

def setup_logger(debug_mode=False):
    # 用根Logger简化配置,避免多Logger冲突
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG if debug_mode else logging.WARNING)
    logger.handlers.clear()  # 清空默认Handler,防止重复输出

    if debug_mode:
        # 调试模式:debug/info同时输出到控制台+专属文件;warning仅输出到控制台
        # 控制台Handler:输出所有>=DEBUG的日志
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        console_handler.setFormatter(formatter)
        logger.addHandler(console_handler)

        # Debug专属文件Handler:仅处理DEBUG级日志
        debug_file_handler = LazyFileHandler('debug.txt')
        debug_file_handler.setLevel(logging.DEBUG)
        debug_file_handler.addFilter(lambda r: r.levelno == logging.DEBUG)
        debug_file_handler.setFormatter(formatter)
        logger.addHandler(debug_file_handler)

        # Info专属文件Handler:仅处理INFO级日志
        info_file_handler = LazyFileHandler('info.txt')
        info_file_handler.setLevel(logging.INFO)
        info_file_handler.addFilter(lambda r: r.levelno == logging.INFO)
        info_file_handler.setFormatter(formatter)
        logger.addHandler(info_file_handler)
    else:
        # 用户交付模式:warning/error仅输出到文件,不显示控制台
        warn_error_handler = LazyFileHandler('warn_error.txt')
        warn_error_handler.setLevel(logging.WARNING)
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        warn_error_handler.setFormatter(formatter)
        logger.addHandler(warn_error_handler)

    return logger

3. 使用示例

if __name__ == '__main__':
    # 调试模式启动:传入True
    logger = setup_logger(debug_mode=True)
    # 用户模式启动:传入False
    # logger = setup_logger(debug_mode=False)

    # 测试日志输出
    logger.debug("这是一条debug日志")
    logger.info("这是一条info日志")
    logger.warning("这是一条warning日志")
    logger.error("这是一条error日志")

关键细节说明

  • LazyFileHandler:通过重写emit方法,把文件创建时机推迟到第一条日志写入时,完全避免空文件生成
  • 日志过滤:用addFilter精准控制每个文件Handler只处理对应级别的日志,实现独立文件存储
  • 模式切换:仅通过debug_mode一个参数就能切换两种运行模式,配置逻辑集中,不会出现多Logger配置错误
  • 清空默认Handler:避免Python自带的根Logger默认输出干扰,确保日志完全按自定义规则输出

内容的提问来源于stack exchange,提问作者krusion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:52:16