python-应用logging打印日志
今日份的更新,是如何实现打印日志的功能。仍然是靠临摹实现最基本的功能,开发可真难啊~
在程序运行过程中,打印日志可以帮助了解程序运行情况及问题定位,python提供了一个标准库模块logging,可以实现一个灵活的事件日志系统。
它一共有两种方式记录日志,这里应用的是使用logging日志系统的四大组件。还有一种是使用logging提供的模块级别的函数,本篇未做介绍。logging模块无需下载,文件中可以直接引入。
import logging
logging日志级别
logging模块提供5个日志等级,级别依次递增,DEBUG<INFO<WARNING<ERROR<CRITICAL。但信息量依次递减,前两个通常是在开发期间应用,输出的信息比较详细,后三个则是在生产环境应用较多。
应用程序设置日志级别或是logging模块设置日志级别之后,日志会输出大于等于此等级的日志。
logging模块定义等级函数的用法如下:
logging.debug(msg,*args,**kwargs)# 定义一个严重级别为debug的函数
logging.info(msg,*args,**kwargs)# 定义一个严重级别为info的函数
logging.warning(msg,*args,**kwargs)# 定义一个严重级别为warning的函数
logging.error(msg,*args,**kwargs)# 定义一个严重级别为error的函数
logging.critical(msg,*args,**kwargs)# 定义一个严重级别为critical的函数
logging日志格式
logging模块中,日志输出的内容及格式均可以进行自定义,下面列举部分输出信息。
内容 | 格式 |
---|---|
日志输出时间 | %(asctime)s |
日志级别 | %(levelname)s |
日志器名称 | %(name)s |
文件名称带后缀 | %(filename)s |
调用日志记录代码所在行号 | %(lineno)s |
日志记录的文本内容 | %(message)s |
logging四大组件
组件名称 | 类名 | 作用 |
---|---|---|
日志器 | Logger | 直接应用的日志接口 |
处理器 | Handler | 将Logger创建的日志发送到目标位置 |
格式器 | Formatter | 日志输出格式 |
过滤器 | Filter | 设置输出日志的过滤条件 |
这几个组件可以理解为,一个日志器可以有多个处理器,不同的处理器可以有不同的格式器以及不同的过滤器,并且把日志输出到不同的位置。
logging组件类
接下来,就可以应用logging四个组件对应的类进行日志的输出了。
logger类
想要创建一个日志器对象,语法为
logger=logging.getLogger()
括号内name为可选参数,不指定则默认日志器名称为root。
创建的logger对象可以设置日志级别,添加日志处理器及过滤器,设置完成后即可创建日志记录。
- 设定日志级别
logger.setLevel(level=logging.INFO)
# 设定日志器的级别为INFO,大于等于该级别的日志均会输出
- 添加处理器
logger.addHandler(handler)
# handler为下方创建的处理器名称
- 创建日志记录
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()
handlers类
handlers类属于基类,它提供了一些子类可以直接应用,方便定义不同的日志输出位置,下面列举四个常用的子类。
类名 | 作用 |
---|---|
logging.StreamHandler | 将日志直接发送到Stream,例如控制台 |
logging.FileHandler | 将日志发送到磁盘文件,默认会无限增大 |
logging.handlers.RotatingFileHandler | 将日志发送到磁盘文件,支持按大小切割文件 |
logging.hanlders.TimedRotatingFileHandler | 将日志发送到磁盘文件,支持按时间切割文件 |
创建一个处理器对象
选择一个比较常用,即以创建可按照时间切割的处理器对象为例进行实现。
from logging.handlers import TimedRotatingFileHandler
handler=TimedRotatingFileHandler(filename=file,when='D',interval=1,backupCount=7)
其中,filename为输出的日志文件位置;
when代表切割单位,周(W),天(D),时(H),每天凌晨(midnight)等;
interval代表切割间隔,上述代码为1天切割为1个文件;
backupCount为最多保存的日志文件个数,超过即会删除最早创建的文件。
处理器对象配置
处理器对象同样可以设置日志级别、日志格式以及添加过滤器。
- 设置日志级别
level=logging.INFO
handler.setLevel(level)
# 设定日志器的级别为INFO,大于等于该级别的日志均会输出
- 设置日志格式
handler.setFormatter(format)
# format为下方Formatter类的实例化对象
Formatter类
logging模块的Formatter类主要用于自定义日志的输出格式。
log_format = '%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s'
format=logging.Formatter(log_format)
Filter类
可以用于指定仅显示符合规则的日志,比如日志器name为test的日志才会被输出到文件。
目前我没有应用这个,所以就先不举例了~
logging应用
首先,建立一个日志初始化文件,创建日志器及对应的处理器。下方主要有两个处理器,一个实现向指定文件中以时间切割的方式输出日志,另一个实现直接在控制台输出日志。
#log.py
import logging
import os
from logging.handlers import TimedRotatingFileHandler
basepath = os.path.abspath(os.path.dirname(__file__))
log_level = logging.DEBUG
log_format = '%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s'
log_file = os.path.join(basepath, 'log', 'log.txt')
def log_init():
logger = logging.getLogger() # 创建一个日志器
logger.setLevel(level=log_level) # 日志器的级别设置
formatter = logging.Formatter(log_format) # 日志格式
handler = TimedRotatingFileHandler(filename=log_file, when='D', interval=1, backupCount=7) # 创建一个按时间切割文件的处理器
handler.setLevel(log_level) # 处理器的级别设置
handler.setFormatter(formatter) # 处理器的格式
logger.addHandler(handler) # 给日志器增加处理器
console = logging.StreamHandler()
# 创建向控制台输出日志内容的第二个处理器
console.setLevel(log_level)
console.setFormatter(formatter)
logger.addHandler(console)
在其他文件中,引用上述文件方法并进行初始化,定义日志器,打印日志。
test01.py
import logging
from log import log_init
import time
log_init()
logger = logging.getLogger('t01')
logger.info('log test')
t = time.strftime('%Y%m%d_%H%M%S', time.localtime())
print(t)
运行test01文件,控制台输出结果如图:
控制台输出结果
日志文件如图:
log.txt
以上,就实现了初步的日志打印,至于在日志中如何打印出代码中的变量等等,还需要下一步学习,我们下次见~
自我记录,有错误欢迎指正~