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

如何捕获Python logging的错误消息参数并保存至日志文件?

解决错误消息参数捕获并写入日志文件的问题

核心问题分析

你当前的日志配置本身能正常记录消息,但错误参数未被捕获的根源是日志调用方式不正确,或是未配置捕获异常上下文的格式项。

具体实现方案

1. 正确传递自定义参数到日志

不要自行拼接字符串,而是利用日志方法的参数传递功能,通过占位符让日志系统自动格式化:

# 错误示例:手动拼接字符串,无法标准化捕获参数
logger.error(f"API请求失败,状态码:{status_code}")

# 正确示例:用占位符传递参数,参数会被日志系统解析并写入
logger.error("API请求失败,状态码:%s", status_code)

2. 捕获异常的完整上下文(含栈信息与参数)

如果要记录异常的详细报错信息(比如具体报错行、异常参数),可以直接用logger.exception(),或在调用logger.error()时添加exc_info=True参数:

try:
    result = 10 / 0
except ZeroDivisionError as e:
    # 方法1:logger.exception自动捕获完整异常栈
    logger.exception("除法运算执行出错")
    
    # 方法2:手动指定exc_info=True,同时传递自定义参数
    logger.error("除法运算执行出错:%s", str(e), exc_info=True)

3. 调整日志格式(可选,显示更多上下文)

如果需要在日志中额外展示进程ID、线程ID或异常栈文本,可以修改格式化器的格式字符串:

# 新增%(process)d(进程ID)、%(thread)d(线程ID)、%(exc_text)s(异常栈文本)
formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(process)d %(thread)d %(message)s %(exc_text)s")

完整修改后的代码

import logging
import sys

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 调整格式,支持显示异常栈文本
formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(message)s %(exc_text)s")

stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.DEBUG)
stdout_handler.setFormatter(formatter)

file_handler = logging.FileHandler("MontFin.log", mode='a')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)

logger.addHandler(file_handler)
logger.addHandler(stdout_handler)

# 测试带参数的错误日志
try:
    num = int("abc123")
except ValueError as e:
    # 记录带自定义参数的错误+完整异常栈
    logger.exception("字符串转整数失败,输入内容:%s", "abc123")

效果说明

  • logger.exception()会自动将异常的完整栈信息(报错行、异常类型、参数)写入日志
  • 占位符传递参数的方式,能确保参数被标准化捕获并格式化到日志消息中
  • 格式中的%(exc_text)s仅在触发exc_info=True或logger.exception()时填充内容,不会影响普通日志的可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:50:25