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

2022-06-21 11:30:47 +08:00
 Richard14

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

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

这个是祸乱之源, 只要最外层捕获错误即可。
Morriaty
2022-06-21 18:36:07 +08:00
@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-06-21 18:43:36 +08:00
@ruanimal 我也是这样做的,内层只 raise ,然后在入口处捕获处理。不知道是不是最佳实践😅
jaylengao
2022-06-21 19:36:40 +08:00
log.exception(e) 会打印完整错误堆栈
ClericPy
2022-06-21 20:56:35 +08:00
想说的都被别人说完了... 主要也是 loguru 的那套

不过之前公司打算上 ELK, 包装了一份 JSON log 感觉挺爽的, error 的 class + msg + traceback
rationa1cuzz
2022-06-21 21:02:05 +08:00
traceback 解君愁

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

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

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

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

© 2021 V2EX