Python logging日志错误和exception异常

需求

  • 在Python 错误等级日志输出或是程序异常时做一些处理,如:日志告警,异常通知

实现

logging record

  • 通过重写 logging.Logger.callHandlers 方法可以在打印日志时做一些其他的处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
ruby复制代码import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

old_callHandlers = logging.Logger.callHandlers # 复制原有的 callHandlers


def callHandlers(self, record):
try:
return old_callHandlers(self, record)
finally:
# 这里可以添加自定义业务逻辑, 每次打印log都会进来
if record.levelno >= logging.ERROR: # 大于等于ERROR等级的log才输出
logger.info("callHandlers: %s", record.message)


# 替换原来的callHandlers方法
logging.Logger.callHandlers = callHandlers

logger.info("info log")
logger.error("error log")
logger.error("error log001")


# 输出
INFO:__main__:info log
ERROR:__main__:error log
INFO:__main__:callHandlers: error log
ERROR:__main__:error log001
INFO:__main__:callHandlers: error log001

异常处理

  • 实现 sys.excepthook 方法,如果是线程需要实现 threading.excepthook
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ruby复制代码import sys
import logging


def callback_func(exc_type, exc_value, exc_traceback):
logging.error("callback_func>>>>>>>>>>>>>>", exc_info=(
exc_type, exc_value, exc_traceback))


sys.excepthook = callback_func

1 / 0


# 输出
ERROR:root:callback_func>>>>>>>>>>>>>>
Traceback (most recent call last):
File "C:/Users/dong/PycharmProjects/err-callback-py/main.py", line 14, in <module>
1 / 0
ZeroDivisionError: division by zero

最后

  • 推荐一个封装好的库 err-callback-py, 那样直接写自己的业务逻辑就可以了

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%