使用Python将Exception异常错误堆栈信息写入日志文件

  • Post category:Python

当我们在使用Python编写代码过程中,由于各种原因(比如数据异常、文件不存在等)可能会导致程序崩溃,从而抛出Exception异常。为了便于排查问题,我们需要将Exception错误信息打印出来,这时候可以通过将异常错误堆栈信息写入日志文件的方式来进行记录和排查。下面来详细讲解如何使用Python来实现将Exception异常错误堆栈信息写入日志文件的方法:

1. 安装日志库

在Python中有很多优秀的日志库,比如logging、loguru等,这里以logging库为例进行讲解。首先需要在Python环境下安装logging库,可以通过以下命令完成安装:

pip install logging

2. 导入日志库

安装完成后,在编写Python代码时需要导入logging库,可以通过以下语句实现:

import logging

3. 实现日志设置

在代码中设置日志的级别、保存格式、保存位置等相应参数,可以通过以下代码实现:

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='/path/to/log_file',
                    filemode='a')

上述代码中,配置了日志的级别为DEBUG(即输出所有级别的日志信息),保存格式为时间、级别、信息内容,保存位置为指定的文件路径。其中,filemode=’a’指定以追加方式写入日志文件,如果没有该文件则新建。

4. 捕获异常并写入日志

在代码中进行异常处理,捕获异常后通过logging库的方法写入到日志文件中。可以通过以下代码实现:

try:
    # code block may raise exception
except Exception as e:
    # write the error stack to the log file
    logging.exception(str(e))

上述代码中,try块内编写出现异常的代码,except块用于捕获异常并将错误信息利用logging.exception()方法写入日志文件。其中,str(e)用于获取异常信息,对于Exception异常,logging.exception()方法会将错误信息和错误堆栈信息一并写入到日志文件中。

示例说明

下面给出两个使用Python将Exception异常错误堆栈信息写入日志文件的示例:

示例一:文件不存在异常

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='example.log',
                    filemode='a')

try:
    with open('non_existed_file', 'r') as f:
        content = f.read()
except Exception as e:
    logging.exception(str(e))

上述代码中,打开不存在的文件会抛出FileNotFoundError异常,然后通过logging库捕获捕获该异常,并将错误信息和错误堆栈信息一并写入到日志文件example.log中。在使用该代码进行测试时,example.log文件会输出以下内容:

2021-05-12 11:31:26,697 ERROR [Errno 2] No such file or directory: 'non_existed_file'
Traceback (most recent call last):
  File "example.py", line 9, in <module>
    with open('non_existed_file', 'r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'non_existed_file'

示例二:JSON格式化异常

import logging
import json

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s',
                    filename='example.log',
                    filemode='a')

data_str = '{ "person": { "name": "Tom", "age": "20" } }'

try:
    data = json.loads(data_str)
    age = int(data['person']['age'])
except Exception as e:
    logging.exception(str(e))

上述代码中,将JSON字符串格式转换为Python对象时,由于age的值为字符串类型,在进行数字转换时会抛出ValueError异常,该异常被logging库捕获后,将错误信息和错误堆栈信息一并写入到日志文件example.log中。在使用该代码进行测试时,example.log文件会输出以下内容:

2021-05-12 11:35:41,715 ERROR invalid literal for int() with base 10: '20'
Traceback (most recent call last):
  File "example.py", line 9, in <module>
    age = int(data['person']['age'])
ValueError: invalid literal for int() with base 10: '20'

通过上述示例代码,我们可以看到,通过将异常错误堆栈信息写入日志文件,可以方便我们进行问题排查和错误修复。