记录器是程序不可或缺的部分,没有了记录器是很难在程序中发现问题所在的,只能一个模块一个模块的去排查
有了记录器就会很快定位到位置所在,这样就可以方便的找到错误,为排查问题降低成本
一个记录器标准模块,根据级别返回有效信息
Level等级 数值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOTSET 0
NOTSET<DEBUG<INFO<WARNING<ERROR<CRITICAL 可以这么理解,包含的关系,一层一层的概括进去
log的配置可以分开来配置
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO) #设置输出等级
ph = logging.StreamHandler() #创建输出控制台的容器
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") #配置输出的内容
ph.setFormatter(formatter) #将配置内容添加到创建的容器里
logger.addHandler(ph) #将我们的容器添加到handler
logger.info("控制台输出内容")
Formatter是设置输出的展示内容,可以传多参数
既然在控制台输出了,还要输出到文件中,保存起来
在创建个FileHandler,添加到Handler容器中就可以实现了
logger = logging.getLogger() # 初始化logger
logger.setLevel(logging.INFO) #设置log级别
fileTimeName = time.strftime("%Y-%m-%d",time.localtime()) # 输出日期,设置log文件名字
genpath = os.path.abspath("..") #获取到根目录
logpath = os.path.join(genpath,"log") #拼接log文件路径
logFileName = logpath+"/"+fileTimeName+".log"
fh = logging.FileHandler(logFileName,mode="w",encoding="utf-8") #既然是写入文件,就需要传个文件路径和名字,mode是写入方式,encoding编码格式
if os.path.exists(logpath): #判断路径是否存在,不存在则创建
pass
else:
os.makedirs(logpath)
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] %(name)s - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)
总结
1、log常用两种方式
控制台输出
写入本地文件中
2、控制台输出,使用StreamHandler()
写入文件,使用FileHandler(path,mode="w",encoding="utf-8")
其他部分都是通用的,初始化,设置输出等级,设置输出样式,添加到handler里