1、什么是日志
日志跟踪软件运行时事件的方法(跟踪器)
2、日志作用
问题地位
信息查询
数据分析
3、内置模块 logging
logging的四大组件:
1、日志器 Logger --->入口
2、处理器 Handler---》执行者 决定日志在不同端进行输出 ( 日志文件 控制
台)
3、格式器 Formatter---》日志输入的内容
4、过滤器 Filter----》输出感兴趣日志信息,过滤掉不感兴趣的日志信息
关系:1个日志器可以有多个处理器,
每个处理器可以各自的格式器及过滤器
4、logging模块的应用
从低到高日志级别:
debug 调试信息
info 关键事件描述warning 警告信息
error
错误信息
critical
严重错误信息
import logging
import os
from logging import handlers
from Common.handle_config import conf
from Common.handle_path import logs_dir
class MyLogger(logging.Logger):
def __init__(self,file=None):
# 设置输出级别、输出渠道、输出日志格式
# super().__init__(name,level)
super().__init__(conf.get("log","name"),conf.get("log","level"))
# 日志格式
fmt = '%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d line:%(message)s'
formatter = logging.Formatter(fmt)
# 控制台渠道
sh = logging.StreamHandler()
sh.setFormatter(formatter)
self.addHandler(sh)
if file:
# 文件渠道
fh = logging.handlers.TimedRotatingFileHandler(file, # 定义日志文件
when="D", # 记录日志时间:按天
interval=1, # 记录日志的频率
backupCount=7, # 保存日志的时间
encoding="UTF-8" # 记录日志的编码方式
) # 文件处理器
fh.setFormatter(formatter)
self.addHandler(fh)
# 是否需要写入文件
if conf.getboolean("log","file_ok"):
file_name = os.path.join(logs_dir,conf.get("log","file_name"))
else:
file_name = None
logger = MyLogger(file_name)
if __name__ == '__main__':
logger.info("1111111111111")
5、重复日志输出的原因
调用一次函数 就会重复添加处理器解决方案:添加日志器和处理器前做判断是否已经存在
import logging
class FrameLog:
def getLogger(self):
# 创建日志器
logger = logging.getLogger("logger")
# 日志输出当前级别及以上级别的信息,默认日志输出最低级别是warning
if not logger.handlers:
logger.setLevel(logging.INFO)
# 创建控制台处理器----》输出控制台
SH = logging.StreamHandler()
# 创建文件处理器----》输出文件
FH = logging.FileHandler("log.txt")
# 日志包含哪些内容 时间 文件 日志级别 :事件描述/问题描述
formatter = logging.Formatter(fmt="[%(asctime)s] [%(filename)s] %(levelname)s :%(message)s",
datefmt='%Y/%m/%d %H:%M:%S')
logger.addHandler(SH)
logger.addHandler(FH)
SH.setFormatter(formatter)
FH.setFormatter(formatter)
return logger
def sum(self,*args):
"""
求多个数之和
:param args:
:return:
"""
try:
sum=0
for num in args:
sum+=num
self.getLogger().info(f"计算多个数之和={sum}")
return sum
except Exception as error:
self.getLogger().error("计算多个数之和有异常:\n"+str(error))
def sum_two(self,x,y):
"""
求两个数之和
:param args:
:return:
"""
try:
sum=0
sum=x+y
self.getLogger().info(f"计算多个数之和={sum}")
return sum
except Exception as error:
self.getLogger().error("计算多个数之和有异常:\n"+str(error))
def sum_three(self,x,y,z):
"""
求两个数之和
:param args:
:return:
"""
try:
sum=0
sum=x+y+z
self.getLogger().info(f"计算多个数之和={sum}")
return sum
except Exception as error:
self.getLogger().error("计算多个数之和有异常:\n"+str(error))