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

如何格式化Python日志中的异常堆栈跟踪信息?

解决混乱Python堆栈跟踪的格式化问题

当然有办法自动修复这些格式混乱的堆栈跟踪!既然你只能拿到日志里的字符串,没法修改日志生成逻辑,我们可以用正则表达式写个小脚本,把混乱的字符串重新整理成标准的Python栈跟踪格式。

核心思路

混乱的栈跟踪本质上是把原本分行的内容挤在了一起,我们只需要识别出栈跟踪的各个组成部分:

  1. 开头的Traceback (most recent call last):标识
  2. 每一行的File "...", line X, in ...调用栈条目
  3. 最后的异常类型(及可选的异常消息)

用正则表达式拆分这些部分,再重新排版成标准格式即可。

实现脚本

这里有个现成的Python函数,能处理你给出的示例以及大部分常见的混乱栈跟踪:

import re

def format_mangled_traceback(raw_trace):
    # 匹配栈跟踪的起始行
    traceback_header = re.match(r'(Traceback \(most recent call last\):)', raw_trace)
    if not traceback_header:
        return raw_trace  # 如果不是栈跟踪内容,直接返回原字符串
    
    formatted_lines = [traceback_header.group(1)]
    remaining_content = raw_trace[traceback_header.end():].strip()
    
    # 匹配所有调用栈中的File条目
    call_stack_pattern = re.compile(r'File "(.*?)", line (\d+), in (.*?)(?= File |$)')
    for match in call_stack_pattern.finditer(remaining_content):
        # 给每个调用栈条目加上缩进,还原标准格式
        formatted_lines.append(f'  File "{match.group(1)}", line {match.group(2)}, in {match.group(3)}')
    
    # 提取最后的异常信息
    if call_stack_pattern.finditer(remaining_content):
        last_match = list(call_stack_pattern.finditer(remaining_content))[-1]
        exception_content = remaining_content[last_match.end():].strip()
        if exception_content:
            formatted_lines.append(exception_content)
    
    return '\n'.join(formatted_lines)

# 测试你的示例输入
raw_example = 'Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in bar File "<stdin>", line 2, in foo ValueError'
print(format_mangled_traceback(raw_example))

运行效果

把你给出的混乱输入丢进去,会输出标准格式的栈跟踪:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in bar
  File "<stdin>", line 2, in foo
ValueError

扩展说明

这个脚本还能处理带异常消息的情况,比如输入是Traceback (most recent call last): File "test.py", line 5, in main File "test.py", line 2, in divide ZeroDivisionError: division by zero,输出会自动整理成:

Traceback (most recent call last):
  File "test.py", line 5, in main
  File "test.py", line 2, in divide
ZeroDivisionError: division by zero

如果遇到更复杂的嵌套异常(比如raise X from Y),可以稍微调整正则表达式来适配,但这个版本已经能覆盖绝大多数日志里出现的情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:28:00