logging模块就是处理日志的
日志就是程序运行中的信息,保留在文件中
logging是内置的,不需要单独安装,可以直接用
日志的等级 机制
debug: 调试
info:信息输出
warning:警告
error:错误
critical:紧急
设置到 warning,就会输出其上的warning,error,critical三个基本的log
四个组件(类)
logger:计量器,日志采集
handler:处理器,将日志发送到合适的路径
fomatter:格式化器,设定日志格式
filter:过滤器
默认级别
我从低到高分别输出信息,可以看到日志中并没有显示debug和info信息,只有warning和更高级别的信息,说明默认级别是warning
默认级别是warning,但是我想要看到debug和info级别的信息,那么可以手工设置
设置默认级别
logging.basicConfig(level=logging.DEBUG)
debug一般用来输出只在调试阶段有用的信息,这五个级别的输出,
配置信息内容
format:指定输出的格式和内容,format可以输出很多有用的信息,
参数:作用
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别的名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息
把日志输出到文件
日志文件的复杂处理: logger + handler
举例1:如何设置才能让日志既在屏幕显示又在日志文件中保存?
# 在屏幕和日志文件中同时输出
# 用logger配合多个handler进行复杂处理
# 定义一个logger收集器(在当前模块运行时名字叫main,在其他模块调用的时候名字叫当前模块的名字)
logger = logging.getLogger(__name__)
# 定义收集logger的级别
logger.setLevel(level=logging.DEBUG)
# 配置控制台的handler
console = logging.StreamHandler()
# 定义控制台日志的级别
console.setLevel(level=logging.DEBUG)
# 将handler加入到logger中
logger.addHandler(console)
# 日志文件的handler(文件名,编码)
log_file = logging.FileHandler("log.txt", encoding="utf-8")
# 设置日志文件中显示的日志级别,设置到warning级别
log_file.setLevel(logging.WARNING)
# 将handler加入logger
logger.addHandler(log_file)
# 让logger收集错误信息
logger.debug("这是debug信息")
logger.info("这是info信息")
logger.warning("这是warning信息")
logger.error("这是error信息")
logger.critical("这是critical信息")
执行后可以看到,即在控制台显示日志,又在文件中显示日志
举例2:设置输出日志格式
# 定义一个logger收集器(在当前模块运行时名字叫main,在其他模块调用的时候名字叫当前模块的名字)
logger = logging.getLogger(__name__)
# 定义收集logger的级别
logger.setLevel(level=logging.DEBUG)
# 配置日志格式信息
log_format = "%(asctime)s -- %(levelname)s -- %(message)s"
# 先处理一下,处理成handler能用的format
handler_f = logging.Formatter(log_format)
# 配置控制台的handler
console = logging.StreamHandler()
# 定义控制台日志的级别
console.setLevel(level=logging.DEBUG)
# 设置日志格式
console.setFormatter(handler_f)
# 将handler加入到logger中
logger.addHandler(console)
# 日志文件的handler(文件名,编码)
log_file = logging.FileHandler("log.txt", encoding="utf-8")
# 设置日志文件中显示的日志级别
log_file.setLevel(logging.WARNING)
# 设置日志文件的输出格式
log_file.setFormatter(handler_f)
# 将handler加入logger
logger.addHandler(log_file)
# 让logger收集错误信息
logger.debug("这是debug信息")
logger.info("这是info信息")
logger.warning("这是warning信息")
logger.error("这是error信息")
logger.critical("这是critical信息")
import logging
from logging.handlers import RotatingFileHandler
# 定义一个logger收集器
logger = logging.getLogger(__name__)
# 日志回滚
# 就是handler不一样,参数也就不一样了(文件名,编码格式,最大文件是多大,保存成几个文件)
log_file = RotatingFileHandler("log.txt", encoding="utf-8", maxBytes=1*1024, backupCount=2)
# 设置日志文件中显示的日志级别
log_file.setLevel(logging.WARNING)
# 将handler加入logger
logger.addHandler(log_file)
# 让logger收集错误信息
logger.debug("这是debug信息")
logger.info("这是info信息")
logger.warning("这是warning信息")
logger.error("这是error信息")
logger.critical("这是critical信息")
# 输出的文件不够大,无法看到保存成几个文件,我循环几遍
for i in range(100):
logger.warning("这是warning信息")