python+pytest接口自动化之日志管理模块loguru简介
作者:给你一页白纸 发布时间:2021-10-25 14:41:34
python自带日志管理模块logging
,使用时可进行模块化配置,详细可参考博文Python日志采集(详细)。
但logging
配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理,则容易出现日志丢失或记录错乱的情况。
python中有一个用起来非常简便的第三方日志管理模块--loguru
,不仅可以避免logging的繁琐配置,而且可以很简单地避免在logging中多进程多线程记录日志时出现的问题,甚至还可以自定义控制台输出的日志颜色。
接下来我们来学习怎么使用loguru
模块进行日志管理。
安装
第三方模块,需要先安装,安装命令如下:
pip install loguru
简单示例
简单使用示例如下:
from loguru import logger
# 日志写入文件则需使用add()方法,"../log/test.log"即日志文件路径,可自定义。
# 写入文件的日志里有中文的话,需要加上encoding="utf-8",否则会显示乱码。
logger.add("../log/test.log", encoding="utf-8", rotation="500MB",
enqueue=True, retention="7 days")
# 打印不同类型的日志
logger.debug("这是一段debug级别日志")
logger.info("这是一段info级别日志")
logger.warning("这是一段warning级别日志")
logger.critical("这是一段critical级别日志")
上面的示例代码运行之后,会在控制台打印如下日志:
同时也会在 "../log/test.log" 路径中写入日志,如下:
由以上结果可以看出:
loguru中直接提供了一个日志记录对象logger,拿来即用;
loguru默认的输出格式为:时间 | 级别 | 模块名 | 行号 | 日志信息;
不同级别的日志在控制台显示颜色不一样。
当然,在实际项目中我们还需要日志管理器有更丰富的配置,loguru中的add()
方法便具有强大的配置功能,接下来介绍add()
方法提供的常用配置功能。
add()常用参数说明
loguru
模块源码中add()
方法的参数如下:
sink(官方文档简单翻译如下):
可以传入类
file
对象,如sys.stderr
或者open('test.log', 'w')
。可以传入文件路径
str
或pathlib
,如示例代码中的写入日志文件路径。路径可以使用一些附加参数对其进行参数化,如test_{time}.log
,{time}
即时间参数,创建文件时文件名称中会加入时间。可以传入像
lambda
这样的可调用函数的简单函数,如lambda msg:print(msg)
。这允许完全由用户偏好和需求定义日志记录过程。还可以是使用
async def
语句定义的异步协程函数。该函数返回的协程对象将使用loop.create_task()
添加到事件循环中。在使用complete()结束循环之前,应该等待这些任务。也支持传入logging模块的
Handler
,如FileHandler
、StreamHandler
等,Loguru
记录会自动转换为日志模块预期的结构。
level:发送到sink
的日志消息的最低日志级别,即输出的最低日志级别。
format:定义日志的输出格式。
filter:过滤日志。
colorize:终端日志输出的颜色。
serializer:bool值,输出日志时是否先格式化成JSON
数据格式。
backtrace:bool值,是否进行异常跟踪(即backtrace
信息记录)。
diagnose:bool值,异常跟踪是否应显示变量值以简化调试。在生产中应将其设置为False,以避免泄漏敏感数据。
enqueue:bool值,日志消息输出之前是否先通过多进程安全队列,多进程多线程运行写入日志时需用到,避免日志记录丢失或混乱。
catch:bool值,是否自动捕获 * 处理日志消息时发生的错误。如果为True,则在sys上显示异常消息。
继续看loguru
模块源码,如下:
即我们需要将日志写入指定的文件时,可以使用截图中新增的参数。常用的参数说明如下:
rotation:指定日志文件记录条件,日志输出太多需要隔一段时间写入新文件时适用。
# rotation指定日志文件最大为500MB,超过则新建文件记录日志
logger.add("../log/test.log", rotation="500MB")
# 指定每天12:00新建日志记录文件:rotation="12:00"
# 指定每隔10天新建日志记录文件:rotation="10 days"
# 指定每隔一个星期新建日志记录文件:rotation="1 week"
# 指定每隔两个月新建日志记录文件:rotation="2 months"
retention:指定日志保留时长,会清除超过指定时长的数据。
# rotation指定日志保留时长,如"1 week", "3 days", "2 months"
logger.add("../log/test.log", retention="10 days")
compression:配置文件压缩格式。
# rotation指定日志保留时长,如"gz", "bz2", "xz", "lzma", "tar", "tar.gz", "tar.bz2", "tar.xz", "zip"
logger.add("../log/test.log", compression="zip")
encoding:指定写入文件时的编码格式,这在示例代码中已说明。
使用
接下来,我们使用常用的参数来组合定义日志记录方式。
from loguru import logger
import sys
# format建议直接使用默认的格式
logger.add("../log/test_{time}.log", level="INFO", encoding="utf-8", enqueue=True, rotation="500MB", retention="1 week")
# 当然也可以自定义format,如下示例
# logger.add("../log/test_{time}.log",
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {name} | {line} | {message}", encoding="utf-8", enqueue=True, rotation="500MB", retention="1 week")
# 打印不同类型的日志
logger.debug("这是一段debug级别日志")
logger.info("这是一段info级别日志")
logger.warning("这是一段warning级别日志")
logger.critical("这是一段critical级别日志")
参数说明:
sink="../log/test_{time}.log"
,即指定日志文件路径,且加入了{time}
,创建.log
文件时名称会加上时间。level="INFO"
,写入文件时只会写入INFO
及以上级别的日志 (需要大写),即INFO、WARNING、CRITICAL。encoding="utf-8"
,日志写入文件时指定编码格式为"utf-8",否则有中文的话会显示乱码。enqueue=True
,支持多线程多进程执行时按照队列写入。rotation="500MB"
,日志文件最大为500MB,超过则新建。retention="1 week"
,日志保留一周,过后则清除。format
没有指定即使用默认格式,建议直接使用默认的格式,见代码注释。
执行代码后,结果如下:
从结果中可以看出来,输出内容中模块部分显示的是如__main__:<module>:20
的形式,而并不是我们想要看到的对应的模块名称,这是因为直接执运行了当前文件的文件,如果是其他模块调用执行便会显示对应的模块名称。
来源:https://www.cnblogs.com/lfr0123/p/16226204.html


猜你喜欢
- 做一个总结,把自己这些年的从业经历和观感罗列一下,某些话可能触及到个人神经,但它们没有恶意。设计师喜欢把世界想象得很美好,社会很和谐,但是这
- calccalc 是一个我们想要做剖析(性能分析)的异步函数。按照惯例,它的最后一个参数是一个callback。我们像这样使用 calc:c
- 废话不多说,直接给大家贴代码了,具体代码如下所示,关键代码如下:<!DOCTYPE html> <html lang=&q
- python opencv实现目标跟踪python-opencv3.0新增了一些比较有用的 * 算法这里根据官网示例写了一个 * 类程序只能
- v-for除了可以循环数组,还可以循环对象。例子:<template><div> <div v-for=&qu
- 最近在使用echarts做报表需求,二次生成报表时数据合并,无法正确显示。第一次渲染:第二次渲染:可以看到这里的echarts项的serie
- 如何显示最后十名来访者?代码和说明见下:<%Application.LockIF NOT isArray(&nbs
- Go 语言教程Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Robert Griesemer,
- 一、前言1.1 回归分析是用于研究分析某一变量受其他变量影响的分析方法,其基本思想是以被影响变量为因变量,以影响变量为自变量,研究因变量与自
- 1. 引言之前已经有博客专门介绍了Python中的列表生成式,可能大家还不太擅长。这里推荐九个Python列表生成式的面试题(从简单到困难排
- <html> <head> <title>Login</title> <meta ht
- 前言本篇文章要使用OpenCV、Numpy 和Math这3个工具包实现一个简单的滤镜编辑器。在这个滤镜编辑器中,包含了3种滤镜效果,它们分别
- 本篇博客参考Keqi Zhang的文章“A Progressive Morphological Filter for Removing No
- Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测
- 1.简介TensorFlow是一个由Google Brain团队开发的开源软件库,用于各种人工智能和机器学习应用,包括神经网络、深度学习、强
- 正则表达式循环匹配字符串public static void main(String[] args) { /**
- pylint是一个不错的代码静态检查工具。将其配置在pycharm中,随时对代码进行分析,确保所有代码都符合pep8规范,以便于养成良好的习
- pygame介绍Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac O
- 多表关系在进行数据库表结构的设计时,会根据业务的需求和业务模块之间的关系,分析设计表结构,由于业务之间相互关联,所以各个表结构之间也存在各种
- 一、方框滤波 方框滤波是均值滤波的一种形式。在均值滤波中,滤波结果的像素值是任意一个点的邻域平均值,等于各邻域像素值之和的均值,而在方框