Python 日志输出异常的正确姿势?

2022 年 6 月 21 日
 Richard14

项目里为了程序在服务器上长期运行不会中断,在所有可能出异常的位置加了 try / except Exception as e ,但是有时候需要根据日志调试错误的时候,捕捉了 e 但是不太好在日志里查看,因为不能直接 raise ,这样的话程序就中断了,但是如果打印 e 的话又不包含整个错误的产生链,经常搞不清状况

5375 次点击
所在节点    Python
23 条回复
Kinnice
2022 年 6 月 21 日
简单做法: 把 e 的上下文中,你感觉需要分析的东西和 e 一块打出来
StarainX
2022 年 6 月 21 日
logger.error(MSG, ext_info=1) 呢?
banditt
2022 年 6 月 21 日
traceback 这个库可以打印
awanabe
2022 年 6 月 21 日
traceback.print_exc()
把错误堆栈打出来
SenLief
2022 年 6 月 21 日
loguru 也可以
fkdtz
2022 年 6 月 21 日
loguru 直接给你把调用栈写到日志里,还支持输出异常时的变量值便于排查问题,可以试试
hsfzxjy
2022 年 6 月 21 日
logger.exception()试试
arischow
2022 年 6 月 21 日
extra 这个 parameter 看看?
Richard14
2022 年 6 月 21 日
@SenLief
@fkdtz
@hsfzxjy loguru 很好用,试了下 logger.exception 打印信息很全。一个问题是这个默认输出的是 error 级别的,有无方法调整成 warning 级别。有一些非关键错误想用 warning ,后面还会接一个日志分析,如果 error 就告警,warning 就忽略之类的。。。
SenLief
2022 年 6 月 21 日
lucays
2022 年 6 月 21 日
打印 e 的代码改成 logger.info(f'exception: {traceback.format_exc()}')就可以了
当然如果可以,引入第三方库更好一些
Morriaty
2022 年 6 月 21 日
logging.error("message", exc_info=e) 就行了啊
killva4624
2022 年 6 月 21 日
试试 sentry ?
featureoverload
2022 年 6 月 21 日
@Morriaty logger.error(msg, exc_info=True) / logging.error(msg, exc_info=True)
ruanimal
2022 年 6 月 21 日
“项目里为了程序在服务器上长期运行不会中断,在所有可能出异常的位置加了 try / except Exception as e”

这个是祸乱之源, 只要最外层捕获错误即可。
Morriaty
2022 年 6 月 21 日
@featureoverload 应该传的就是 exc_info=e ,只不过 logging.__init__.py 里对其他传参做了兼容,源码是
```python
if exc_info:
if isinstance(exc_info, BaseException):
exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
elif not isinstance(exc_info, tuple):
exc_info = sys.exc_info()
```
caqiko
2022 年 6 月 21 日
@ruanimal 我也是这样做的,内层只 raise ,然后在入口处捕获处理。不知道是不是最佳实践😅
jaylengao
2022 年 6 月 21 日
log.exception(e) 会打印完整错误堆栈
ClericPy
2022 年 6 月 21 日
想说的都被别人说完了... 主要也是 loguru 的那套

不过之前公司打算上 ELK, 包装了一份 JSON log 感觉挺爽的, error 的 class + msg + traceback
rationa1cuzz
2022 年 6 月 21 日
traceback 解君愁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/861072

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX