需求
- 在Python 错误等级日志输出或是程序异常时做一些处理,如:日志告警,异常通知
实现
logging record
- 通过重写 logging.Logger.callHandlers 方法可以在打印日志时做一些其他的处理
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
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
复制代码
最后
近期评论