关于日志
日志是对软件执行时所发生的事情的一种追踪的方式。
软件开发人员对于他们的代码添加日志记录调用,借此来指示某个事件的发生。
事件通过包含变量数据的描述信息来描述的。
软件开发人员还会区分不同事件的重要性,即将不同的事件区分为不同的等级、或者严重程度。
事件严重等级划分
日志所追踪的事件的严重程度划分,以及各个等级所对应的适用程度如下:
级别 | 何时使用 |
---|---|
debug | 事件的细节信息,当诊断问题时使用 |
info | 确认程序按照预期运行 |
warning | 表示有已知,或者即将发生的意外,但是程序还可以按照预期运行 |
error | 由于严重的问题。程序的某些功能已经不能正常执行 |
critical | 严重的错误,使得程序无法继续执行 |
模块定义的基本类
在logging模块,定义了几个基本的类,以实现日志的全部功能,各个基本的类定义如下:
- Logger、暴露了应用程序代码可直接使用的日志api接口;
- Handler、将Logger创建的日志记录发送到恰当的目标地点;
- Filter、提供更精细的设施,用于确定要输出的日志记录;
- Formatter、指定最终输出的日志记录的格式。
每个想使用日志功能的模块或者应用,使用一个Logger实例将日志信息添加到日志中。Logger将创建LogRecord实例用来将日志事件信息保存在内存中。Logger可以有多个Handler实例用来接收与处理日志记录,而Handler实例将使用Formatter实例将日志记录转换为输出信息格式。
记录日志到文件
大多数应用需配置日志记录到文件,范例如下:
import logging
logging.basicConfig(filename='test.out', level=logging.DEBUG)
logging.debug('this message should go to the log file')
with open('test.out', 'rt') as f:
body = f.read()
print(body)
在发生异常时,需记录异常的日志事件,直接使用无参数的debug、info、warning、error、或者critical函数并不能记录异常信息,需要设置exc_info参数为True,或者使用exception方法。范例如下:
import logging
logging.basicConfig(filename="test.log", filemode="w",
format="%(asctime)s %(name)s:%(levelname)s:%(message)s",
datefmt="%d-%M-%Y %H:%M:%S",
level=logging.DEBUG)
a = 5
b = 0
try:
c = a / b
except Exception as e:
#下面三种方式三选一,推荐使用第一种
logging.exception("Exception occurred")
logging.error("Exception occurred", exc_info=True)
logging.log(level=logging.DEBUG, msg="Exception occurred", exc_info=True)