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.