如何使用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
相关产品推荐
相关产品推荐

