文章目录
- 初步使用
- basicConfig函数
- Formatter类
初步使用
Python标准库提供了一个灵活的事件日志系统logging
,可以对软件执行时发生的事件进行追踪,是开发过程中必不可少的调试工具。
logging
中提供了几个最频繁使用的函数,下表中,除了print
外,其余均为logging
中的函数。
工具 | 适用场景 |
print() | 将结果显示在控制台 |
debug() | 记录/输出调试信息 |
info() | 记录/输出操作信息 |
warning() | 记录/输出警告信息 |
error() exception() critical() | 记录/输出错误信息 |
logging
的优越之处并不仅仅是提供了更加便捷的错误声明,而是可以直接写入到日志文件中,例如
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('这是一条debug')
logging.info('这是一条info')
logging.warning('这时出现了一个警告')
logging.error('这是一个错误')
在运行这些之后,打开example.log
,可以看到里面的内容是
DEBUG:root:这是一条debug
INFO:root:这是一条info
WARNING:root:这时出现了一个警告
ERROR:root:这是一个错误
basicConfig函数
在上面的例子中,可以很明显地发现basicConfig
是一个很关键的函数,在上例中输入的三个参数中,filename
为文件路径;encoding
为编码方案,level
为日志级别。
其完整的参数如下
- filename 使用指定的文件名创建一个FileHandler。
- filemode 打开文件的模式,默认为**‘a’**,即追加。
- level 设置根记录器级别为指定的 level.
- force 若设为true,则在执行其他参数指定的配置之前,移除并关闭附加到根记录器的所有现有处理器。
- encoding 需要和filename一同被指定,为文件的编码方式。
- format 使用指定的格式字符串作为处理器
- datefmt 使用指定的日期/时间格式
- style 格式字符串风格。
format, datefmt, style这三个参数将放在Formatter类中做详细的解读。
除了可以通过文件路径来创建日志文件之外,logging还提供了两种日志创建参数,下面两个参数与filename互不兼容,如果同时存在两个,会引发ValueError
- stream 使用指定的流初始化StreamHandler
- handlers 使用指定的根日志记录器作为日志文件。
其中,警告级别level可选值如下,
- DEBUG 调试细节,是最低日志级别,会输出所有日志信息。
- INFO 确认程序按预期运行。
- WARNING 表明已经或即将发生意外(例如磁盘空间不足),但程序仍按预期进行。
- ERROR 出现错误,导致某些功能无法正常执行
- CRITICAL 严重错误导致程序崩溃
下面重新进入命令行,设置level
以及format
,来看一下输出日志的变化
logging.basicConfig(filename='ex2.log', format='%(levelname)s:%(message)s', level=logging.INFO)
logging.debug('这是一条debug')
logging.info('这是一条info')
logging.warning('这时出现了一个警告')
logging.error('这是一个错误')
日志内容如下,发现级别低于logging.INFO
的debug
信息未被写入到日志中。
INFO:这是一条info
WARNING:这时出现了一个警告
ERROR:这是一个错误
Formatter类
在basciConfig
函数中有关输出格式的参数,均通过Formatter
来实现,尽管在调用中隐藏了Formatter
的对象化过程。Formatter
的构造函数为
Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)
其中fmt
对应basciConfig
中的format
;datefmt
和style
分别对应basicConfig
中的datefmt
和style
。
style
共有三种形参,分别是%
, {
或 $
,分别对应%-formatting
, str.format()
或者string.Template
这三种fmt
格式。
在上例中,style
默认为%
,所以设置fmt
为'%(levelname)s:%(message)s'
。其中并未包含时间信息,故而datefmt
的设置是无意义的。
接下来
logging.basicConfig(filename='ex3.log', format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', force=True)
logging.warning('再来一个警告')
则ex3.log
中的内容为
01/23/2023 11:50:14 AM 再来一个警告