logging模块
![image]()
1、logging模块简介
# logging模块又叫日志模块
# 导入日志模块
import logging
import logging.config
# 1、日志分为五个等级
# 1、debug级别
logging.debug('debug级别') # 级别为10
'''
debug级别是代码运行一行记录一行
'''
# 2、info级别
logging.info('info级别') # 级别为20
'''
info级别则是记录产生的信息
'''
# 3、warning级别
logging.warning('warning级别') # 级别为30
'''
warning级别记录程序的预警信息,日志默认的级别为warning级别
'''
# 4、error级别
logging.error('error级别') # 级别为40
'''
error级别记录程序的异常信息
'''
# critical级别
logging.critical('critical级别') # 级别为50
'''
critical级别记录程序出现重大事故的信息
'''
# 2、日志文件需要考虑的两点
'''针对日志模块需要考虑以下几点
1、日志的产生位置
终端(可以理解为直接在显示屏上显示)
文件(写入文件中,只有打开文件时才能看到)
2、日志的格式
打印日志的格式,且不同的产生位置的打印格式不一样
'''
![image]()
2、日志生成过程
# 3.1 logging对象
log = logging.getLogger('登录记录')
'''
logging对象主要负责产生日志信息
'''
# 3.2 filter对象:负责过滤对象。可以直接忽略
# 3.3 handler对象
hd1 = logging.FileHandler('a.txt', encoding='utf8') # 产生文件
hd2 = logging.StreamHandler() # 产生在终端的
'''
handler对象主要负责日志的产生位置
'''
# 3.4 formatter对象
fm1 = logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
fmt='%(asctime)s - %(name)s %(message)s',
datefmt='%Y-%m-%d',
)
'''
formatter对象主要负责日志的打印格式
生成日志的过程:
产生日志>>>过滤日志>>>选择产生位置>>>日志格式化
'''
# 3.5 绑定handler对象
log.addHandler(hd1)
log.addHandler(hd2)
'''
绑定handler对象:日志名.addHandler(产生位置)
'''
# 3.6 绑定formatter对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
'''
绑定formatter对象:handler.setFormatter(格式1)
'''
# 3.7 设置日志等级
log.setLevel(30) # 30为warning级别
# 3.8 记录日志
log.debug('日志信息')
'''
基于以上日志生成的过程,会发现我们每次要写的时候会很麻烦,
但是,生成日志有一个通用模板,下面就来说一下这个
'''
![image]()
3、配置字典
# 4、配置字典
# 核心就在于CV
import logging
import logging.config
# 格式可以直接套用就好,如果有兴趣可以自行研究
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 日志文件产生的位置(文件),先在配置文件里配置好日志文件产生的文件路径
logfile_path = 'a3.log'
# log配置字典
'''即日志生成的过程,可以直接使用下面的通用模板,
核心在于cv,有兴趣的可以了解一下其内部的一些关键字,
会在文章末尾附上相关关键字的解释
'''
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # 过滤日志
'handlers': {
#打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
#打印到文件的日志,收集info及以上的日志
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024*1024*5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置 空字符串作为键 能够兼容所有的日志
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
}, # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
},
}
'''
以上就是日志配置信息,一般写在配置文件里
'''
![image]()
4、日志调用
# 使用配置字典
logging.config.dictConfig(LOGGING_DIC) # 自动加载字典中的配置
log1 = logging.getLogger('日志文件')
log1.debug('好好学习')
'''
由于日志文件在很多功能都要用得到,且要在不同地方重复调用,
因此,我们可以将其封装成函数写入公共功能里,任其他功能调用
'''
![image]()