项目里为了程序在服务器上长期运行不会中断,在所有可能出异常的位置加了 try / except Exception as e ,但是有时候需要根据日志调试错误的时候,捕捉了 e 但是不太好在日志里查看,因为不能直接 raise ,这样的话程序就中断了,但是如果打印 e 的话又不包含整个错误的产生链,经常搞不清状况
1
Kinnice 2022-06-21 11:43:11 +08:00
简单做法: 把 e 的上下文中,你感觉需要分析的东西和 e 一块打出来
|
2
StarainX 2022-06-21 11:48:29 +08:00
logger.error(MSG, ext_info=1) 呢?
|
3
banditt 2022-06-21 11:55:38 +08:00
traceback 这个库可以打印
|
4
awanabe 2022-06-21 11:57:59 +08:00
traceback.print_exc()
把错误堆栈打出来 |
5
SenLief 2022-06-21 12:09:10 +08:00
loguru 也可以
|
6
fkdtz 2022-06-21 12:29:50 +08:00 1
loguru 直接给你把调用栈写到日志里,还支持输出异常时的变量值便于排查问题,可以试试
|
7
hsfzxjy 2022-06-21 12:36:28 +08:00 via Android 2
logger.exception()试试
|
8
arischow 2022-06-21 12:40:14 +08:00 via iPhone
extra 这个 parameter 看看?
|
9
Richard14 OP |
10
SenLief 2022-06-21 13:14:14 +08:00 via iPhone
|
11
lucays 2022-06-21 13:33:50 +08:00 1
打印 e 的代码改成 logger.info(f'exception: {traceback.format_exc()}')就可以了
当然如果可以,引入第三方库更好一些 |
12
Morriaty 2022-06-21 14:10:24 +08:00
logging.error("message", exc_info=e) 就行了啊
|
13
killva4624 2022-06-21 14:16:08 +08:00 1
试试 sentry ?
|
14
featureoverload 2022-06-21 14:53:28 +08:00
@Morriaty logger.error(msg, exc_info=True) / logging.error(msg, exc_info=True)
|
15
ruanimal 2022-06-21 16:17:57 +08:00
“项目里为了程序在服务器上长期运行不会中断,在所有可能出异常的位置加了 try / except Exception as e”
这个是祸乱之源, 只要最外层捕获错误即可。 |
16
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() ``` |
17
caqiko 2022-06-21 18:43:36 +08:00 via Android
@ruanimal 我也是这样做的,内层只 raise ,然后在入口处捕获处理。不知道是不是最佳实践😅
|
18
jaylengao 2022-06-21 19:36:40 +08:00
log.exception(e) 会打印完整错误堆栈
|
19
ClericPy 2022-06-21 20:56:35 +08:00
想说的都被别人说完了... 主要也是 loguru 的那套
不过之前公司打算上 ELK, 包装了一份 JSON log 感觉挺爽的, error 的 class + msg + traceback |
20
rationa1cuzz 2022-06-21 21:02:05 +08:00
traceback 解君愁
|
21
ruanimal 2022-06-21 22:12:39 +08:00
|
22
louiswong2099 2022-06-22 10:43:11 +08:00
sentry_sdk 这个也挺好用的,不知道适不适合你,可以捕获日志,还可以传到服务器慢慢看,分类都有,使用很简单:
https://docs.sentry.io/platforms/python/usage/ |
23
Macv1994 2022-06-25 14:04:40 +08:00
traceback 可以打印详细异常,写个异常捕捉的装饰器,要捕捉的地方加个装饰器就行了。
|