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

