最近使用logging模块打印日志的时候对于如何打印异常调用栈的使用方式感到迷惑,总结了下面几种方法,也都是一些基本使用的方式,算抛砖引玉了。不说了,直接上代码。
import traceback
import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
consoleHandler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
fileHandler = logging.FileHandler('./info.log', encoding='utf-8')
fileHandler.setLevel(logging.INFO)
fileHandler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
# 使用logging模块打印异常调用栈的方法
# 方法一
def method01():
try:
b = 1/ 0
except Exception as e:
logger.exception("occur execption:\n %s", e)
# 方法二
def method02():
try:
b = 1/ 0
except:
logger.error("occur execption:\n %s", traceback.format_exc())
# 方法三
def method03():
try:
b = 1/ 0
except:
logger.error("occur execption:", exc_info=True)
# 方法四
def method04():
try:
b = 1/ 0
except:
logger.exception("occur execption")
if __name__ == '__main__':
method01()
# method02()
# method03()
# method04()
我这里是同时在控制台和文件中都做了打印。
方法一是使用了logging模块的exception方法,可以将具体的异常调用栈打印出来。
方法二是基于traceback模块中的format_exc()方法执行格式化打印。
方法三是在logging模块的error方法中配置对应参数执行打印。
方法四还是使用logging模块的exception方法,它会直接把异常调用栈打印出来,因为这个方法的参数中已经默认了exc_info=True。
上面几种方法最后打印出来的异常调用栈信息如下: