logging日志模块
平时我们在使用所写的程序过程中,可能会通过print测试代码执行过程的问题,又或是debug来进行调试,但是在我们将程序开发完成以后,持续运行状态,整个程序就处于未知状态,如果说一直pirnt的话,那不是得一直盯着屏幕了!那么我们就需要一个日志来帮我们存储程序的运行状态,或是存放报错信息利于检测日志时发现程序的漏洞。当我们使用日志记录以后,我们可以做到时间记录、状态记录、报错记录等等。
那么现在就来了解一下Python中提供的记录日志的模块logging
logging模块的介绍
logging提供了两种记录日志的方式
第一种:使用logging提供的函数进行日志记录
logging.basicConfig()通过具体参数来更改logging模块默认行为
logging.debug()
logging.info()
logging.warning()
logging.error()
logging.critical()
第二种:使用logging提供的对象来进行日志记录(更为灵活)
Logger:我们进行日志记录时创建的日志对象,我们可以调用它的方法来传入日志模板和对应的日志信息然后由它进行记录下来,Log Record
Filter:过滤日志,在拿到日志信息以后,我们可以对其进行过滤筛选,拿到我们需要的日志信息,或者只保存某个错误信息的日志。
Handler:控制日志打印的位置。Handler里提供的两个参数:FileHandler用来打印到文件中,StreamHandler用来打印到终端
Formatter:接收Logger产生的日志信息,我们可以将它进行格式化输出,将日志内容定义成我们想要的数据格式,然后交给Handler处理。
日志级别
可以使用对应的单词参数,也可以使用数字代替
日志等级(Level) | 描述 |
---|---|
CRITICAL 50 | 非常严重的问题,程序面临崩溃 |
ERROR 40 | 错误信息,可能是某一功能不能运行,不处理会出现一系列问题 |
WARNING 30 | 警告信息,不会影响程序运行,但需要及时检查 |
INFO 20 | 记录普通信息,日志信息详细程度,详细程度仅次于DEBUG |
DEBUG 10 | 调试级别,一般用于问题排查,详细记录日志信息 |
logging模块的基本用法
import logging
logging.debug('DEUBG: this debug record')
logging.info('INFO: this info record')
logging.warning('WARNING: this warning record')
logging.error('ERROR: this error record !!')
logging.critical('CRITICAL: this critical record !!!!!!')
以上输出结果
可以发现只有WARNING
级更过级别的日志显示出来,因为日志默认级别为warning
,输出的日志级别只有大于或等于WARNING,才会打印到终端显示
配置logging默认参数
使用logging.basicConfig()
对产生的日志进行全局配置
先简单使用,查看效果
import logging
logging.basicConfig(
level=logging.DEBUG, # 设置日志级别
format = '%(asctime)s:%(message)s'# 日志显示格式
)
logging.debug('this debug record')
logging.info('this info record')
logging.warning('this warning record')
logging.error('this error record !!')
logging.critical('this critical record !!!!!!')
以上输出结果:
basicConfig()
函数可用参数,
level | 设置日志启动级别,不设置则默认为WARNING |
---|---|
format | 设置日志输出的格式 |
datefmt | 日志时间输出格式,前提是format里面定义了%(asctime)s |
filename | 设置日志默认输出位置,默认:StreamHandler输出到屏幕,我们设置后启用:FileHandler 这样就会输出到文件内 |
filemode | 日志写入文件的模式,默认是a模式:在文件末尾追加日志信息,w模式:清空文件内容后写入 |
format日志输出格式可用参数
%(name)s | Logger的名字,并非用户名,详细查看 |
---|---|
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出函数的模块的完整路径名,可能没有 |
%(filename)s | 调用日志输出函数的模块的文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(funcName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数的语句所在的代码行 |
%(created)f | 当前时间,用UNIX标准的表示时间的浮 点数表示 |
%(relativeCreated)d | 输出日志信息时的,自Logger创建以 来的毫秒数 |
%(asctime)s | 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 |
%(thread)d | 线程ID。可能没有 |
%(threadName)s | 线程名。可能没有 |
%(process)d | 进程ID。可能没有 |
%(message)s | 用户输出的消息 |
我们再写一个实例,使用上序的参数
import logging
logging.basicConfig(
level=logging.DEBUG,
format = '%(asctime)s:%(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
datefmt = '%Y-%m-%d %H:%M:%S', # 时间格式 x年-x月-日 时:分:秒
filename = 'test.log', # 设置日志输出位置,不存在此文件则自动创建后写入日志信息
filemode = 'a' # 文件追加模式
)
logging.debug('this debug record')
logging.info('this info record')
logging.warning('this warning record')
logging.error('this error record !!')
logging.critical('this critical record !!!!!!')
以上运行结果:可用看到日志已经输出到文件,并且是以我们定义的格式
logging对象
我们使用getLogger()
方法来构建对象,那么我们可以对这个对象进行配置
可以一个或多个Handler,用于将日志信息输出到文件或是屏幕
可以一个或多个Formatter,用于将不同日志输出信息定义不同格式
将Formatter绑定到Handler,最后使用getLogger()
来产生日志
logging提供的对象在介绍日志模块时已经提到过,现在我们来进行使用即可
我们接着创建不同的输出位置:
logger = logging.getLogger('test')