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