目录
三、日志输出格式:fm = logging.Formatter(formater)
2.设置日志收集器收集的等级(没有设置之前,默认是warning等级)
3.日志输出渠道的等级并添加到收集器中(没有设置之前,默认是warning)
1.按文件大小轮转:logging.handlers.RotatingFileHandle
2.按时间轮转:logging.handlers.TimedRotatingFileHandler
python日志模块处理以及封装
一、日志的五个等级【从低到高】
级别 | 说明 |
DEBUG | 输出详细的运行情况,主要用于调试 |
INFO | 确认一切按预期运行,一般用于输出重要运行情况 |
WARNING | 一些意想不到的事情发生了(比如:警告,内存空间不足),但是这个软件还能按预期工作,再不久的将来会出现问题 |
ERROR | 发生了错误软件没能执行一些功能,还可以继续执行 |
CRITICAL | 一个严重的错误,表明程序本身可能无法继续运行 |
注意:这5个等级,也分包对应5种打日志的方法:debug,info,error,critical。默认是WARNING,当在WARNING或之上时才被追踪
二、最简单的日志输出
import logging
logging.debug("这个是debug等级的日志")
logging.info("这个是info等级的日志")
logging.warning("这个是warning等级的日志")
logging.error("这个是error等级的日志")
logging.critical("这个是critical等级的日志")
三、日志输出格式:fm = logging.Formatter(formater)
formater = '%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s'
日志相关参数
四、日志收集器
1.创建日志收集器对象
mylog=logging.getLogger("liu")
2.设置日志收集器收集的等级(没有设置之前,默认是warning等级)
mylog.setLevel("DEBUG")
3.日志输出渠道的等级并添加到收集器中(没有设置之前,默认是warning)
# 第三步:日志输出渠道的等级(没有设置之前,默认是warning等级)
# 1.输出至控制台的渠道
# 创建输出渠道
sh = logging.StreamHandler()
# 设置输出渠道的等级
sh.setLevel("DEBUG")
# 将输出渠道添加到收集器中
mylog.addHandler(sh)
4.输出到文件
# 创建输出渠道(输出到文件)
fh = logging.FileHandler("log.log", encoding="utf8")
fh.setLevel("ERROR")
mylog.addHandler(fh)
5.日志输出格式的设置 与输出【控制台&指定文件】
# 第四步:日志输出格式的设置
# formater="%(asctime)s-%(filename)s-%(levelno)s-%(lineno)s, %(message)s"
formater = '%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s'
# 创建一个输出格式
fm = logging.Formatter(formater)
# 将输出格式和输出渠道绑定
sh.setFormatter(fm) # 输出格式和输出渠道绑定:控制台
fh.setFormatter(fm) # 将输出格式和输出渠道绑定:文件
6.整体示例
设置logging,创建一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,然后将日志写入到指定的文件中,并输出至控制台【ps:将控制台和日志文件,都理解为一个接收装置】
【ps:个人理解创建日志过程:先有一个容器对日志进行接收,接收哪些垃圾需要去回收,之后再思考要接收哪些地方的数据,需要放置在收集器中(地方要接收哪些垃圾,需要过滤,以及格式的设置),将地方收集到的其放置在容器中(容器会根据容器的过滤条件,去过滤地方的垃圾)】
import logging
# 第一步:创建一个日志收集器对象
mylog = logging.getLogger("liuhao")
# 第二步:设置日志收集器收集的等级(没有设置之前,默认是warning等级)
mylog.setLevel("DEBUG")
# 第三步:日志输出渠道的等级(没有设置之前,默认是warning等级)
# 1.输出至控制台的渠道
# 创建输出渠道
sh = logging.StreamHandler()
# 设置输出渠道的等级
sh.setLevel("DEBUG")
# 将输出渠道添加到收集器中
mylog.addHandler(sh)
# 第三步:2.输出到文件
# 创建输出渠道(输出到文件)
fh = logging.FileHandler("log.log", encoding="utf8")
fh.setLevel("ERROR")
mylog.addHandler(fh)
# 第四步:日志输出格式的设置
# formater="%(asctime)s-%(filename)s-%(levelno)s-%(lineno)s, %(message)s"
formater = '%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s'
# 创建一个输出格式
fm = logging.Formatter(formater)
# 将输出格式和输出渠道绑定
sh.setFormatter(fm) # 输出格式和输出渠道绑定:控制台
fh.setFormatter(fm) # 将输出格式和输出渠道绑定:文件
输出
五、日志轮转
1.按文件大小轮转:logging.handlers.RotatingFileHandle
2.按时间轮转:logging.handlers.TimedRotatingFileHandler
3.使用logging第三方模块
3.1.RotatingFileHandler(按照文件大小分割)
hdlr = logging.handlers.RotatingFileHandler(LOG_FILE,maxBytes=1024*1024,backupCount=40)
3.2.TimedRotatingFileHandler(按照时间间隔分割)
hdlr = logging.handlers.TimedRotatingFileHandler(LOG_FILE,when='M',interval=1,backupCount=40)
参数解释:
interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复.
backupCount 是保留日志个数.默认的0是不会自动删除掉日志,若设10,则在文件的创建过程中库会判断是否有超过这个10,若超过,则会从最先创建的开始删除
when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件
4.实例
import logging
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
# 第一步:创建一个日志收集器对象
mylog = logging.getLogger("liuhao")
# 第二步:设置日志收集器收集的等级(没有设置之前,默认是warning等级)
mylog.setLevel("DEBUG")
# 第三步:日志输出渠道的等级(没有设置之前,默认是warning等级)
"""
# 创建一个根据文件大小进行轮转的输出渠道
fh = RotatingFileHandler(filename="mylog.log",
encoding="utf8",
maxBytes=1024,
backupCount=3)
"""
#创建一个根据时间进行轮转的收集器
fh=TimedRotatingFileHandler(filename="my.log",encoding="utf8",when="S",interval=1,backupCount=7)
# 设置输出等级
fh.setLevel("DEBUG")
# 添加到收集器中
mylog.addHandler(fh)
# 第四步:日志输出格式的设置
# formater="%(asctime)s-%(filename)s-%(levelno)s-%(lineno)s, %(message)s"
formater = '%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s'
# 创建一个输出格式
fm = logging.Formatter(formater)
# 将输出格式和输出渠道绑定
fh.setFormatter(fm) # 将输出格式和输出渠道绑定:文件
mylog.debug("这个是debug等级的日志")
mylog.info("这个是info等级的日志")
mylog.warning("这个是warning等级的日志")
mylog.error("这个是error等级的日志")
mylog.critical("这个是critical等级的日志")
六、python日志类的封装
import logging
class HandleLog(object):
@staticmethod
def creat_logger():
# 创建收集器,设置收集器的等级
mylog = logging.getLogger("liuhao")
mylog.setLevel("DEBUG")
# 创建输出到控制台的渠道,设置等级
sh = logging.StreamHandler()
sh.setLevel("DEBUG")
mylog.addHandler(sh)
# 创建输出到文件的渠道
fh = logging.FileHandler("log.log", encoding="utf8")
fh.setLevel("ERROR")
mylog.addHandler(fh)
# 设置日志输出格式
formater = '%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:%(message)s'
fm = logging.Formatter(formater)
sh.setFormatter(fm) # 输出格式和输出渠道绑定:控制台
fh.setFormatter(fm) # 将输出格式和输出渠道绑定:文件
return mylog
log=HandleLog.creat_logger()
log.info("python888")
七、总结
1.引用日志函数:import logging
2.创建日志收集器:getLogger
3.设置日志等级:setLevel
5.日志添加到收集器:addHandler
4.设置日志输出渠道:常用的为前四个
5.设置日志输出格式:Formatter
6.输出日志渠道和格式绑定:setFormatter
7.个人理解对该模块:有点像垃圾的回收
【ps:个人理解创建日志过程:先有一个容器对日志进行接收(垃圾总长),接收哪些垃圾需要去回收,之后再思考要接收哪些地方的数据,需要放置在收集器中(地方要接收哪些垃圾,需要过滤,以及格式的设置),将地方收集到的其放置在容器中(容器会根据容器的过滤条件,去过滤地方的垃圾)】