Python中的日志功能(logging)

日志是调试程序时的一把利器,特别时对于服务端的程序来说。Python标准库中已经带了日志库 – logging。其功能和Java中著名的一些日志库(log4j, logback等)非常相似,无论是API还是总体架构。这篇文章就带大家看看如何使用Python中的logging。

基础使用

logging模块是Python自带的库的形式存在,使用起来非常方便,只需要在import对应的库就可以:

1
import logging

与其它语言(平台)的日志系统一样,logging中记录日志也分为不同的级别,从低到高分别是:

  1. DEBUG
  2. INFO
  3. WARNING
  4. ERROR
  5. CRITICAL
    每个级别也有对应的方法,分别如下:
1
2
3
4
5
6
7
import logging

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

默认输出级别为WARNING, 所以如果你运行上面的程序,最终的输出其实只有最后的三行:

1
2
3
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message

从这三行可以看出,logging默认的输出格式是: 级别:日志类:消息, 因为我们还没有设置生成任何的日志类(logger), 所以使用了系统默认的根日志类:root。
那如何改变logging的这些默认行为呢?那就要靠设置了。

基础设置

可以使用logging库中的basicConfig方法对logginer的行为进行设置。一些常用的参数包括:

  1. level, 设置日志级别
  2. filename: 指定日志文件
  3. filemode: 日志文件的打开模式,默认为追加模式(append)
  4. format: 指定输出格式

下面我们通过一个例子让大家体会一下:

1
2
3
4
5
6
7
8
9
import logging

logging.basicConfig(level=logging.DEBUG, filename='app.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')

logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

运行这段程序,你会看到在当前目录中生成了一个名为”app.log”的文件,是一个简单的文本文件,打开这个文件, 内容如下:

1
2
3
4
5
root - DEBUG - This is a debug message
root - INFO - This is an info message
root - WARNING - This is a warning message
root - ERROR - This is an error message
root - CRITICAL - This is a critical message

对吧前一节中的输出,你可以看到:

  1. 因为设置了日志级别为DEBUG, 所以所有的输出全部输出到文件中了。
  2. 输出的消息的格式符合我们在参数format中的设定

在format时,使用了三个内置的变量: name, levelname 和 message。 完整的变量列表可以参考官方文档

本文标题:Python中的日志功能(logging)

文章作者:Morning Star

发布时间:2019年06月09日 - 18:06

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/python/python-logging-module/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。