8.8 日志记录

8.8.1 使用logging记录日志

用Python写代码的时候,在想看的地方写个print() 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当需要看大量的地方或者在一个文件中查看的时候,这时候print()就不大方便了,所以Python引入了logging模块来记录想要的信息。print()也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息。

引入模块

import logging

8.8.2 日志的级别:

日志功能应以所追踪事件级别或严重性而定。各级别适用性如下(以严重性递增):

级别 何时使用
DEBUG 细节信息,仅当诊断问题时适用。
INFO 确认程序按预期运行
WARNING 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行
ERROR 由于严重的问题,程序的某些功能已经不能正常执行
CRITICAL 严重的错误,表明程序已不能继续执行
logging.debug('This is debug message') 
logging.info('This is info message') 
logging.warning('This is warning message') 
logging.error('This is error message')
logging.critical('This is critical message')

默认的level是logging.WARNING,低于该级别的就不输出了。

控制日志打印等级的语句

logging.basicConfig(level=logging.INFO)

8.8.3 日志输出格式

Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。

format常用格式说明:

  • %(levelno)s: 打印日志级别的数值。
  • %(levelname)s: 打印日志级别名称。
  • %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]。
  • %(filename)s: 打印当前执行程序名。
  • %(funcName)s: 打印日志的当前函数。
  • %(lineno)d: 打印日志的当前行号。
  • %(asctime)s: 打印日志的时间。
  • %(thread)d: 打印线程ID。
  • %(threadName)s: 打印线程名称。
  • %(process)d: 打印进程ID。
  • %(name)s: 打印日志名。
  • %(message)s: 打印日志信息。

8.8.4 日志使用

日志库采用模块化方法,并提供几类组件:记录器、处理程序、过滤器和格式化程序。

  • 记录器暴露了应用程序代码直接使用的接口。
  • 处理程序将日志记录(由记录器创建)发送到适当的目标。
  • 过滤器提供了更精细的附加功能,用于确定要输出的日志记录。
  • 格式化程序指定最终输出中日志记录的样式。

例如:8.5-log.py

import logging

# 创建记录器对象
logger = logging.getLogger('test_log')
logger.setLevel(logging.INFO)

# 创建控制台处理程序,设置级别
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)

# 创建格式化程序
formatter = logging.Formatter(
    '%(asctime)s - %(filename)s[line:%(lineno)d] - %(name)s - %(levelname)s: %(message)s')

# 将格式化程序添加到控制台处理程序
sh.setFormatter(formatter)

# 将控制台处理程序添加到记录器
logger.addHandler(sh)

i = 0
while i < 10:
    logger.info('var i : ' + str(i))
    i += 1

logger.warning('while over.')

输出为:

2020-01-13 16:37:30,684 - 8.5-log.py[line:23] - test_log - INFO: var i : 0
2020-01-13 16:37:30,685 - 8.5-log.py[line:23] - test_log - INFO: var i : 1
2020-01-13 16:37:30,685 - 8.5-log.py[line:23] - test_log - INFO: var i : 2      
2020-01-13 16:37:30,685 - 8.5-log.py[line:23] - test_log - INFO: var i : 3      
2020-01-13 16:37:30,686 - 8.5-log.py[line:23] - test_log - INFO: var i : 4      
2020-01-13 16:37:30,686 - 8.5-log.py[line:23] - test_log - INFO: var i : 5      
2020-01-13 16:37:30,686 - 8.5-log.py[line:23] - test_log - INFO: var i : 6      
2020-01-13 16:37:30,694 - 8.5-log.py[line:23] - test_log - INFO: var i : 7      
2020-01-13 16:37:30,694 - 8.5-log.py[line:23] - test_log - INFO: var i : 8      
2020-01-13 16:37:30,694 - 8.5-log.py[line:23] - test_log - INFO: var i : 9      
2020-01-13 16:37:30,695 - 8.5-log.py[line:26] - test_log - WARNING: while over.

如果需要输出日志到文件,则创建一个文件handler:8.6-logfile.py

import logging
import time

# 创建记录器对象
logger = logging.getLogger('file_log')
logger.setLevel(logging.INFO)

# 创建文件处理程序,设置级别
log_name = time.strftime('%Y%m%d') + '.log'
fh = logging.FileHandler(log_name, mode='a')
fh.setLevel(logging.INFO)

# 创建格式化程序
formatter = logging.Formatter(
    '%(asctime)s - %(filename)s[line:%(lineno)d] - %(name)s - %(levelname)s: %(message)s')

# 将格式化程序添加到文件处理程序
fh.setFormatter(formatter)

# 将文件处理程序添加到记录器
logger.addHandler(fh)

i = 0
while i < 10:
    logger.info('var i : ' + str(i))
    i += 1

logger.warning('while over.')

结果为:20200113.log,文件内容为:

2020-01-13 16:56:28,216 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 0
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 1
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 2
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 3
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 4
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 5
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 6
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 7
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 8
2020-01-13 16:56:28,217 - 8.6-logfile.py[line:25] - file_log - INFO: var i : 9
2020-01-13 16:56:28,220 - 8.6-logfile.py[line:28] - file_log - WARNING: while over.