Python的logging包提供了日志功能。

logging一般用于

诊断日志 记录与应用程序操作相关的日志。例如,用户遇到的报错信息, 可通过搜索诊断日志获得上下文信息。

审计日志 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息, 并结合其他用户资料构成用户报告或者用来优化商业目标。

下面介绍其基本使用方法。 logging记录的日志是分级别的。按照严重程度从低到高排列为 DEBUGINFOWARNINGERRORCRITICAL 。 下表展示了各级别日志的用途。

级别 用途
DEBUG 用于诊断程序时。
INFO 确认工作如预期一样进行。
WARNING 提醒未预料到的事情发生,或者将要发生什么问题。程序还是会正常运行下去。
ERROR 由于某个严重的问题,程序不能执行某些函数。
CRITICAL 程序出错,不能继续运行下去。

logging输出的级别默认为 WARNING

一个最简单的例子

1
2
3
import logging
logging.warning("将会输出")
logging.info("这条不会显示")  # 因为默认级别是 WARNING
将会显示:

1
WARNING:root:将会输出

下面这个例子通过logging.basicConfig函数配置logging的日志文件和级别。

1
2
3
4
5
6
7
import logging
logging.basicConfig(filename='example.log', level=logging.DEBUG)
logging.debug('这条信息会显示到example.log')
logging.info('这条也是')
logging.warning('这条同样')
logging.critical('同样显示')
logging.info('也会显示')
文件打开的模式默认是append,可以通过给logging.basicConfig传入filemode参数控制。 例如,
1
logging.basicConfig(filename='example.log', filemode='w')
在每次运行时,都会覆盖以前的日志文件。

如果代码包含其他模块,而其他模块也需要logging,下面的方法可以供以参考。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# main program
import logging
import mylib

def main():
    logging.basicConfig(level=logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == 'main':
    main()
1
2
3
4
5
# mylib.py
import logging

def do_something():
    logging.info('Doing something')
将会显示:

1
2
3
INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

通过给logging.basicConfig传入format参数可以改变日志信息的格式。 例如,

1
2
3
import logging
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.DEBUG)
logging.debug('hello, debug!')
将会显示:

1
2018-03-04 19:53:35,697 DEBUG: hello, debug!

其中的asctime可以通过传入datefmt参数进一步控制时间的显示。其格式和time.strftime()的一样。 例如,

1
2
3
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
将会显示:

1
03/04/2018 07:56:36 PM is when this event was logged.

总结

  • import logging
  • logging.basicConfig() 配置logging
    • Args
    • filename: 日志文件路径,默认为sys.stderr
    • filemode: 文件写入模式,{'w', 'a'}
    • level: 日志级别,按严重程度从低到高为 DEBUGINFOWARNINGERRORCRITICAL 。默认为logging.WARNING
    • format: 记录输出格式,可定制的几个基本对象是
      • asctime: 适合人阅读的时间格式。
      • levelname: 记录级别。
      • message: 具体记录信息。
    • datefmt: 控制asctime的输出格式,例如'%m/%d/%Y %I:%M:%S %p'。其格式和time.strftime()的一样。