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

如何将Python异常日志输出至DEBUG流而非ERROR流?

实现DEBUG级别输出异常堆栈信息

当然可以实现,核心思路是利用logging.debug()方法并传入exc_info=True参数——logging.exception()本质就是固定调用logging.error(msg, exc_info=True),我们只需要把级别换成DEBUG即可。

基础实现代码

直接修改你的示例代码,替换logging.exception为带参数的logging.debug:

import logging

# 先调整root日志级别为DEBUG(默认是WARNING,会屏蔽DEBUG级日志)
logging.basicConfig(level=logging.DEBUG)

try:
    raise RuntimeError('terrible horrible error')
except Exception:
    logging.warning('an exception happened')
    # 用DEBUG级别输出带堆栈的异常信息
    logging.debug('error occurred here', exc_info=True)

运行后输出会变成:

WARNING:root:an exception happened
DEBUG:root:error occurred here
Traceback (most recent call last):
File "C:\Users...\PycharmProjects\project\main.py", line 31, in
raise RuntimeError('terrible horrible error')
RuntimeError: terrible horrible error

分流到不同输出流的配置

如果要实现异常事实到一个流、堆栈信息到另一个流的需求,需要给logging配置两个不同的Handler,分别过滤对应级别:

import logging
from io import StringIO

# 创建两个输出流对象
warning_output = StringIO()
debug_output = StringIO()

# 配置WARNING级别Handler:只处理WARNING及以上日志
warning_handler = logging.StreamHandler(warning_output)
warning_handler.setLevel(logging.WARNING)
warning_handler.setFormatter(logging.Formatter('%(levelname)s:%(name)s:%(message)s'))

# 配置DEBUG级别Handler:只处理DEBUG及以上日志,专门输出堆栈
debug_handler = logging.StreamHandler(debug_output)
debug_handler.setLevel(logging.DEBUG)
debug_handler.setFormatter(logging.Formatter('%(levelname)s:%(name)s:%(message)s\n%(exc_info)s'))

# 绑定Handler到root logger
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)  # 全局级别设为最低,确保所有日志能被Handler捕获
root_logger.addHandler(warning_handler)
root_logger.addHandler(debug_handler)

try:
    raise RuntimeError('terrible horrible error')
except Exception:
    logging.warning('an exception happened')
    logging.debug('error occurred here', exc_info=True)

# 查看两个流的内容
print("=== WARNING流内容 ===")
print(warning_output.getvalue())
print("\n=== DEBUG流内容 ===")
print(debug_output.getvalue())

可选:封装自定义快捷方法

如果你想像logging.exception一样简化调用,可以封装一个自定义方法:

def debug_exception(msg, logger=None):
    target_logger = logger or logging.getLogger()
    target_logger.debug(msg, exc_info=True)

# 使用示例
try:
    raise RuntimeError('test error')
except Exception:
    debug_exception('debug level exception with traceback')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:35:25