需求
- 在Python 错误等级日志输出或是程序异常时做一些处理,如:日志告警,异常通知
实现
logging record
- 通过重写 logging.Logger.callHandlers 方法可以在打印日志时做一些其他的处理
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
old_callHandlers = logging.Logger.callHandlers
def callHandlers(self, record):
try:
return old_callHandlers(self, record)
finally:
if record.levelno >= logging.ERROR:
logger.info("callHandlers: %s", record.message)
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
最后