如何格式化Python日志中的异常堆栈跟踪信息?
解决混乱Python堆栈跟踪的格式化问题
当然有办法自动修复这些格式混乱的堆栈跟踪!既然你只能拿到日志里的字符串,没法修改日志生成逻辑,我们可以用正则表达式写个小脚本,把混乱的字符串重新整理成标准的Python栈跟踪格式。
核心思路
混乱的栈跟踪本质上是把原本分行的内容挤在了一起,我们只需要识别出栈跟踪的各个组成部分:
- 开头的
Traceback (most recent call last):标识 - 每一行的
File "...", line X, in ...调用栈条目 - 最后的异常类型(及可选的异常消息)
用正则表达式拆分这些部分,再重新排版成标准格式即可。
实现脚本
这里有个现成的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
相关产品推荐
相关产品推荐

