logging模块的四大组件:
1、日志器:logger 给所有的应用程序提供入口
2、处理器:handler 决定在不同端实现输出
3、格式器:formater 决定日志内容(日志包含什么样的信息(时间、某行、信息描述、信息级别))
4、过滤器:filter 信息进行筛选,保留感兴趣的信息
四大组件之间的关系:
1个日志器可以有多个处理器,每个处理器可以有各自的格式和过滤器
日志输出端:日志文件 控制台
# 创建一个日志器,日志器的名字就是logger
logger = logging.getLogger('logger')
# 创建一个处理器, StreamHandler() 控制台实现日志输出
sh = logging.StreamHandler()
# 创建处理器,FileHandler() 将日志输出到文件保存
# time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())
#将当前时间的时间戳转化为日期格式作为日志文件的文件名,防止重名,encoding设置保存日志的编码
fh = logging.FileHandler(f'{time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())}_log.txt', encoding='utf-8')
# 创建一个格式器(fmt是日志包含内容:时间 运行文件: 运行**行 日志级别 日志描述信息
#%()s 是固定格式,s表示字符串的信息,d表示数字型,()中的值:如asctime、filename等是程序固定好的参数,具体如下表,datefmt 表示输出日期的格式)
lf = logging.Formatter(fmt='%(asctime)s | %(filename)s:%(lineno)d 行 | %(levelname)s | %(message)s', datefmt='%Y_%m_%d %H:%M:%S')
# 实现日志输出的方式(控制台)
# 在日志器中加入处理器
logger.addHandler(sh)
# 处理器中设置日志输出格式
sh.setFormatter(lf)
# 实现日志输出的方式(保存到文件)
logger.addHandler(fh)
fh.setFormatter(lf)
格式器fmt参数表
Format | Description |
---|---|
%(asctime)s | 执行时间,默认情况下,格式为“2022-07-08 16:49:45,896”(逗号后面的数字是时间的毫秒部分) |
%(created)f | 执行时间,以时间戳的方式返回 |
%(filename)s | 执行的文件名 |
%(funcName)s | 日志调用的函数名 |
%(levelname)s | 日志返回级别 |
%(levelno)s | 日志返回级别的数值 |
%(lineno)d | 日志执行的行数 |
%(message)s | 日志描述信息 |
%(module)s | 日志记录模块名 |
%(msecs)d | 执行时间毫秒部分 |
%(name)s | 当前记录日志的,日志器名称 |
%(pathname)s | 执行py文件的绝对路径 |
日志级别优先级从低到高分别为:
DEBUG:调试信息
INFO:关键事件描述
WARNING:警告信息
ERROR:错误信息
CRITICAL:严重错误
设定日志器(logger)的日志级别(如果不设定,默认输出WARNING
级别以上的日志)
logger日志级别和handler日志级别的关系:
可以使用logger设置输出日志级别,也可以使用handler设置日志级别,可实现控制台和文件输出不同级别的日志
1、logger设置级别、handler未设置级别,会输出logger设置的级别及以上的日志
2、logger设置error级别,handler设置info级别,会输出logger设置的error及以上的日志
3、logger设置debug级别,handler设置info级别,会输出info级别的日志,debug不输出
综上,程序会先拿到logger设置的级别及以上的日志,最终输出符合handler设置的日志级别及以上的日志,如果logger设置的级别比handler设置的级别高,那么handler设置的级别不生效。
以下为日志器收集日志的应用代码示例:
import logging
import time
class logFrame:
def logg(self):
# 创建一个日志器
logger = logging.getLogger('logger')
# 判断处理器是否存在,如果有处理器就不添加,如果不存在处理器就添加处理器
if not logger.handlers:
# 设定日志器的日志级别(如果不设定,默认展示WARNING级别以上的日志)
logger.setLevel(logging.DEBUG)
# 创建一个处理器, StreamHandler(),在控制台实现日志输出
sh = logging.StreamHandler()
# 创建处理器,FileHandler() 将日志输出到文件进行保存
fh = logging.FileHandler(f'{time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime())}_log.txt', encoding='utf-8')
# 创建一个格式器(fmt是日志包含的内容:时间 运行文件:运行**行 日志级别 日志描述信息 %()s 是固定格式,s表示字符串的信息,d表示数字型,()中的值:如asctime、filename等是程序固定好的参数)
# datefmt 表示输出日期的格式
lf = logging.Formatter(fmt='%(asctime)s | %(filename)s:%(lineno)d 行 | %(levelname)s | %(message)s', datefmt='%Y_%m_%d %H:%M:%S')
# 控制台输出日志
# 在日志器中加入处理器
logger.addHandler(sh)
# 处理器中设置日志输出格式
sh.setFormatter(lf)
# 设置处理器级别
sh.setLevel(logging.INFO)
# 保存日志
logger.addHandler(fh)
fh.setFormatter(lf)
return logger
if __name__ == '__main__':
log = logFrame()
logger = log.logg()
try:
input_info = int(input('请输入你的除数:'))
sum = 4/input_info
# 一般正常返回值或提示信息使用 debug或info级别信息
logger.info(f'计算完成!4/{input_info}={sum}')
logger.debug('debug级别信息')
except Exception as es:
# 功能错误或代码错误,返回错误日志,用error级别记录
logger.error(str(es))