前言
在介绍logging模块的日志流处理流程之前,我们先来介绍下logging模块的四大组件:
组件名称 | 对应类名 | 功能描述 |
---|---|---|
日志器 | Logger | 提供了应用程序可一直使用的接口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
logging模块就是通过这些组件来完成日志处理的,上面所使用的logging模块级别的函数也是通过这些组件对应的类来实现的。
这些组件之间的关系描述:
- 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等;
- 不同的处理器(handler)可以将日志输出到不同的位置;
- 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;
- 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;
- 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。
简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
实例
对于logging模块,我研究的也不是很透彻,但是封装调用还是很OK的,直接上代码
#封装logging
import os,logging
from logging.handlers import TimedRotatingFileHandler
def mylog(logpath):
# 创建一个名字叫test_logger的日志记录器
log = logging.getLogger("test_logger")
log.setLevel(logging.INFO) #设置记录器日志等级
# 创建一个日志处理器
## 这里需要正确填写路径(默认以a+的形式打开文件,在文件末尾添加日志,不存在则创建)
fileHandler = logging.FileHandler(filename = logpath+"/filelog"+".log")
timeHandler = TimedRotatingFileHandler(logpath+'timelog',"M",2,3)
'''
TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
when 是一个字符串的定义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建,取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复。比如:when=’D’,interval=1,表示每天产生一个日志文件
backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设10,则在文件的创建过程中,库会判断是否有超过这个10,若超过,则会从最先创建的开始删除。
'''
## 设置处理器日志级别
fileHandler.setLevel(logging.INFO)
timeHandler.setLevel(logging.INFO)
# 创建一个日志格式器
file_formats = logging.Formatter('%(asctime)s--%(filename)s--%(funcName)s--%(levelname)s: %(message)s')
time_formats = logging.Formatter('%(asctime)s--%(filename)s--%(levelname)s: %(message)s',datefmt='[%Y/%m/%d %H/%M/%S]')
# 将日志格式器添加到日志处理器中
fileHandler.setFormatter(file_formats)
timeHandler.setFormatter(time_formats)
# 将日志处理器添加到日志记录器中
log.addHandler(fileHandler)
log.addHandler(timeHandler)
return log
调用
#调用logging
from public import get_excel,obtain_token,mylog
logger = mylog.mylog(log_path)
try:
logger.info("开始执行接口测试")
......
logger.info("结束")
except:
logger.info("接口测试发生错误")
logger.exception(sys.exc_info()) #打印控制台报错信息
网友评论