文章目录

  • 初步使用
  • 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.INFOdebug信息未被写入到日志中。

INFO:这是一条info
WARNING:这时出现了一个警告
ERROR:这是一个错误

Formatter类

basciConfig函数中有关输出格式的参数,均通过Formatter来实现,尽管在调用中隐藏了Formatter的对象化过程。Formatter的构造函数为

Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)

其中fmt对应basciConfig中的formatdatefmtstyle分别对应basicConfig中的datefmtstyle

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 再来一个警告