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

如何使用Python logging仅在发生错误时生成日志文件?

实现仅在发生错误时创建日志文件

要实现这个需求,核心是不在程序初始化阶段就创建日志文件和绑定文件处理器,而是等到捕获到异常时再动态创建并关联日志处理器,具体修改方案如下:

修改后的代码

import logging
import datetime

logger = logging.getLogger("sample")
logger.setLevel(logging.DEBUG)
# 提前定义日志格式化规则,暂不绑定到文件处理器
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

try:
    # 执行你的业务代码块
    # executing block of code here..
    # 示例:可取消注释下方代码触发异常测试
    # 1 / 0
except Exception as e:
    # 仅在捕获到异常时创建日志文件和处理器
    log_filename = f"log_debug_{datetime.now().strftime('%Y-%m-%d-%H-%M-%S')}"
    file_handler = logging.FileHandler(log_filename, delay=False)
    file_handler.setFormatter(formatter)
    
    # 检查是否已添加同文件的处理器,避免重复输出日志
    handler_exists = any(
        isinstance(h, logging.FileHandler) and h.baseFilename.endswith(log_filename) 
        for h in logger.handlers
    )
    if not handler_exists:
        logger.addHandler(file_handler)
    
    # 记录带异常栈的错误日志
    logger.debug(f"Error occurred: {str(e)}", exc_info=True)
    
    # 可选:记录完成后移除处理器,防止后续日志意外写入该文件
    logger.removeHandler(file_handler)

核心逻辑说明

  • 初始化阶段仅完成日志器级别设置和格式化规则定义,不创建文件处理器,避免提前生成空日志文件。
  • 仅在except异常捕获块中,才动态生成日志文件名、创建文件处理器并绑定到日志器。
  • 添加处理器存在性检查,防止同一异常流程中重复添加处理器导致日志重复输出。
  • 可选的removeHandler操作:如果后续不需要再写入该日志文件,可在记录后移除处理器,避免其他日志写入此文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:43:16