python基础之logging模块

logging模块

logging模块就是处理日志的
日志就是程序运行中的信息,保留在文件中

logging是内置的,不需要单独安装,可以直接用

日志的等级 机制
debug: 调试
info:信息输出
warning:警告
error:错误
critical:紧急
设置到 warning,就会输出其上的warning,error,critical三个基本的log

四个组件(类)
logger:计量器,日志采集
handler:处理器,将日志发送到合适的路径
fomatter:格式化器,设定日志格式
filter:过滤器

默认级别
我从低到高分别输出信息,可以看到日志中并没有显示debug和info信息,只有warning和更高级别的信息,说明默认级别是warning
python基础之logging模块_第1张图片
默认级别是warning,但是我想要看到debug和info级别的信息,那么可以手工设置

设置默认级别

logging.basicConfig(level=logging.DEBUG)

debug一般用来输出只在调试阶段有用的信息,这五个级别的输出,
python基础之logging模块_第2张图片
配置信息内容
python基础之logging模块_第3张图片

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:打印日志信息

把日志输出到文件
python基础之logging模块_第4张图片
日志文件的复杂处理: 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信息")

执行后可以看到,即在控制台显示日志,又在文件中显示日志python基础之logging模块_第5张图片
举例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信息")

python基础之logging模块_第6张图片
举例3:日志回滚如何实现?

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信息")

python基础之logging模块_第7张图片

你可能感兴趣的:(Python,python)