在线上系统中,日志担任着重要的角色,是系统的重要组成部分,用来记录用户操作、系统运行状态和错误信息。因此,日志并不是可由可无的,日志的好坏直接关系到系统出现问题时定位的速度;此外,我们也可以对日志进行观察和分析,提前发现系统可能存在的风险,以预防线上事故的发生。
通常,日志的应用主要分如下两个场景:
- 诊断日志:记录与应用程序操作相关的日志,用于分析和排查线上问题;
- 审计日志:为商业分析而记录的日志,用于构成用户报告、优化商业目标等;比如:Apache 的访问日志,就是一种审计日志。
下面,我们就来认识和了解 Python 内置的日志模块 - logging
吧~
一. 日志等级
Python 标准库中的 logging
模块,为我们提供了日志相关的功能~ 使用 logging
模块,最简单的方式是导入 logging
模块,然后调用它的 debug
info
warn
error
和 critical
等函数记录日志:
import logging
logging.debug('debug msg')
logging.info('info msg')
logging.warning('warning msg')
logging.error('error msg')
logging.critical('critical msg')
运行结果:
logging
模块默认将日志输出到屏幕终端,日志级别为 WARNING
,即只有日志级别大于等于 EARNING
的日志才会被输出。
日志级别通常用来区分日志的重要程度,一方面,我们可以只保存比较高的日志级别,以提高性能;另一方面,也会便于日志的分析。
二. 配置日志格式
使用 logging
记录日志之前,我们可以进行一些简单的配置,如定义日志输出的文件,日志等级:
import logging
logging.basicConfig(filename='app.log', level=logging.INFO)
logging.debug('debug msg')
logging.info('info msg')
logging.warning('warning msg')
logging.error('error msg')
logging.critical('critical msg')
运行上述内容,将产生一个 app.log
的文件,文件中记录了 INFO
级别及以上的内容。
上述例子,我们使用 basicConfig
在代码中配置了日志格式,对于复杂的项目,我们也可以将日志的配置保存到一个单独的配置文件中,然后在代码中使用 fileConfig
来读取配置文件。
在正式介绍 fileConfig
之前,我们先来看 logging
模块中最重要的 3 个概念:
- Logger:日志记录器,是应用程序中能直接使用的接口;
- Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久;
- Formatter:格式化器,用以配置日志的输出格式。
其中,一个日志记录器,可以添加多个日志处理器;一个日志处理器对应一个格式化器。在典型应用场景中,一个日志记录器使用一个日志处理器,一个日志处理器使用一个日志格式化器。
下面的例子中,日志文件将保存所有 DEBUG 级别及以上的日志,输出的每条日志中包含了打印日志的时间、日志级别和日志内容。
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s : %(levelname)s : %(message)s',
filename='app.log'
)
logging.debug('debug msg')
logging.info('info msg')
logging.warning('warn msg')
logging.error('error msg')
运行结果:
对于比较复杂的项目,可以将日志的配置保存到一个配置文件中:
[loggers]
keys = root
[handlers]
keys = logfile
[formatters]
keys = generic
[logger_root]
handlers = logfile
[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('appBetter.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)s-5.5s [%(name)s:%(lineno)s] %(message)s
定义好配置文件之后,在 Python 代码中使用 logging.config
模块的 fileConfig
函数加载日志配置即可:
import logging
import logging.config
logging.config.fileConfig('logging.cnf')
logging.debug('debug msg')
logging.info('info msg')
logging.warning('warn msg')
logging.error('error msg')
运行结果:
关于参数的说明如下:
-
filename
:日志输出的文件名称; -
when
:定义日志切分的时间间隔单位,可选参数有:S
秒、M
分钟、H
小时、D
天、W
Week day 以及midnight
Roll over at midnight ; -
interval
:间隔时间单位的个数,即等待多少个when
的时间后创建新的filename
日志文件; -
backupCount
:保留日志的文件个数。默认为 0,即不会自动删除文件。如果设置为正整数N
,则在创建新的日志文件时,将检查日志文件个数是否到达N
,达到了的话就会从最先创建的开始删除,从而维持日志文件个数始终为N
个。