Python-Loguru:让记录日志更装13
“ 今天勇哥来介绍一款让日志记录在 Python 中变得更加轻松愉快的库——Loguru。它提供了强大的功能和简洁的接口,使我们能够以更加灵活和直观的方式记录和管理日志信息,据说比logging快10倍!!”
1. Loguru 简介
Loguru 是一个功能强大且易于使用的开源日志记录库。它建立在 Python 标准库中的 logging 模块之上,并提供了更加简洁直观的接口。使用 Loguru,我们可以轻松地记录不同级别的日志消息,并根据需求输出到终端、文件或其他目标。
2. Loguru 的安装
安装 Loguru 在命令行中运行以下命令:
pip install loguru
3. Loguru 的基本用法
首先,在代码的开头导入 Loguru 的 logger 对象:
from loguru import logger
然后,我们可以使用 logger.info()、logger.warning() 等方法来记录不同级别的日志消息。例如:
logger.info("这是一条普通的信息日志")
logger.warning("这是一条警告日志")
logger.error("这是一条错误日志")
Loguru 会自动添加时间戳、日志级别和日志消息内容,并将其输出到终端。这样,我们就可以很方便地查看和追踪日志信息。
4. 日志文件的输出
调用 logger.add() 方法来配置文件输出。例如,将日志信息保存到 app.log 的文件中:
logger.add("app.log")
所有的日志信息都将写入到 app.log 文件中。
5. 高级配置
5.1 设置日志级别
logger.level() 方法设置日志的输出级别。默认级别为 INFO。例如,将日志级别设置为 DEBUG:
logger.level("DEBUG")
这样,所有 DEBUG 级别及以上的日志消息都会被输出。
5.2 自定义日志格式
Loguru 允许我们自定义日志的格式。调用 logger.add()方法并设置format 参数,可以指定日志的格式。例如:
logger.add("app.log", format="[{time:HH:mm:ss}] {level} - {message}")
5.3 添加日志切割
当日志文件过大时,我们可以通过添加日志切割选项来分割文件,以便更好地管理和维护。例如,将日志文件每天切割为一个新文件:
logger.add("app.log", rotation="00:00")
6. 实际应用场景
6.1 自动化测试
在自动化测试中,使用 Loguru,我们可以轻松地记录测试步骤、断言结果和异常信息。例如:
@logger.catch
def run_test():
logger.info("开始执行测试")
# 执行测试代码
assert some_condition, "条件不符合"
logger.info("测试通过")
run_test()
6.2 Web 应用程序
在 Web 应用程序中,Loguru 可以方便地集成到 Web 框架中,记录请求的路径、方法、参数等信息,以及响应的状态码和内容。例如:
@app.route("/api/data")
def get_data():
logger.info(f"收到请求:{request.path} [{request.method}]")
# 处理请求并返回响应
return jsonify(data)
7. 日志的封装
在实际应用中,我们最喜欢封装(逼格高),方便在不同模块和函数中重复使用。例如:
"""
@author: 测试玩家勇哥
@contact:262667641@qq.com
@file:mylogger.py
@time:2023/6/12 9:59
@desc: 日志封装
"""
import os
from functools import wraps
from time import perf_counter
from loguru import logger
# from loguru._logger import Logger
class MyLogger:
"""
根据时间、文件大小切割日志
"""
def __init__(self, log_dir='logs', max_size=20, retention='7 days'):
self.log_dir = log_dir
self.max_size = max_size
self.retention = retention
self.logger = self.configure_logger()
def configure_logger(self):
"""
Returns:
"""
# 创建日志目录
os.makedirs(self.log_dir, exist_ok=True)
shared_config = {
"level": "DEBUG",
"enqueue": True,
"backtrace": True,
"format": "{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
}
# 添加按照日期和大小切割的文件 handler
logger.add(
sink=f"{self.log_dir}/{{time:YYYY-MM-DD}}.log",
rotation=f"{self.max_size} MB",
retention=self.retention,
**shared_config
)
# 配置按照等级划分的文件 handler 和控制台输出
logger.add(sink=self.get_log_path, **shared_config)
return logger
def get_log_path(self, message: str) -> str:
"""
根据等级返回日志路径
Args:
message:
Returns:
"""
log_level = message.record["level"].name.lower()
log_file = f"{log_level}.log"
log_path = os.path.join(self.log_dir, log_file)
return log_path
def __getattr__(self, level: str):
return getattr(self.logger, level)
def log_decorator(self, msg="快看,异常了,别唧唧哇哇,块排查"):
"""
日志装饰器,记录函数的名称、参数、返回值、运行时间和异常信息
Args:
logger: 日志记录器对象
Returns:
装饰器函数
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
self.logger.info(f'-----------分割线-----------')
self.logger.info(f'调用 {func.__name__} args: {args}; kwargs:{kwargs}')
start = perf_counter() # 开始时间
try:
result = func(*args, **kwargs)
end = perf_counter() # 结束时间
duration = end - start
self.logger.info(f"{func.__name__} 返回结果:{result}, 耗时:{duration:4f}s")
return result
except Exception as e:
self.logger.exception(f"{func.__name__}: {msg}")
self.logger.info(f"-----------分割线-----------")
# raise e
return wrapper
return decorator
if __name__ == '__main__':
log = MyLogger()
@log.log_decorator("勇哥也不知道错在哪里")
def test_zero_division_error(a, b):
return a / b
for i in range(1000):
log.error('错误信息')
log.critical('严重错误信息')
test_zero_division_error(1, 0)
log.debug('调试信息')
log.info('普通信息')
log.success('成功信息')
log.warning('警告信息')
总结
以上就是勇哥今天为各位小伙伴准备的内容,如果你想了解更多关于Python自动化测试的知识和技巧,欢迎关注我:公众号\博客\CSDN\B站:测试玩家勇哥;我会不定期地分享更多的精彩内容,如果有任何问题或建议,请随时留言讨论。谢谢大家的阅读!!
如果你对 Loguru 感兴趣,可以前往官方文档了解更多详细的信息。
最后
**我相信学习不是一朝一夕形成的,学习是一生的事业,坚持不懈,持续进步,为自己创造更美好的未来。****以上,共勉!
**
题外话,勇哥打算把新建的技术交流群,打造成一个活跃的高质量技术群。工作中遇到的技术问题,都可以在里面咨询大家,还有工作内推的机会。有兴趣的小伙伴,欢迎加我(记得备注是进群还是报名学习)****
************长按上方二维码2秒,关注我
勇哥,10年落魄测试老司机,技术栈偏python,目前在一家超大型房产公司担任自动化测试主管,日常工作比较繁杂,主要负责自动化测试,性能测试、软件质量管理及人员管理。工作之余专注于为粉丝进行简历修改、面试辅导、模拟面试、资料分享、一对一自动化测试教学辅导等副业发展。目前已服务十多位小伙伴,取得高薪offer。
关注公众号,干货及时送达
往期精选文章:
| python-Threading多线程之线程锁 |
| Pytest 快速入门 |
| pytest 前后置操作详谈 |
| 接口自动化之测试数据动态生成并替换 |
| requests模块该如何封装? |
| 最通俗易懂python操作数据库 |
| python正则一篇搞掂 |
| 接口自动化如何封装mysql操作 |
| 性能测试之必备知识 |
| Python + ChatGPT来实现一个智能对话的钉钉机器人 |
| 一文看懂python如何执行cmd命令 |
Python-Loguru:让记录日志更装13的更多相关文章
- python 冷知识(装13 指南)
python 冷知识(装13 指南) list1 += list2 和 list1 = list1 + list2 的区别 alpha = [1, 2, 3] beta = alpha # alpha ...
- 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码
WiFi密码Python暴力破解 Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- 【转】python:让源码更安全之将py编译成so
python:让源码更安全之将py编译成so 应用场景 Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效. python的解释特性是将py编译为独有的二 ...
- diocp3-服务器的连接上限是到底是多少?diocp3的一个装13测试(8W连接数)
服务器的连接上限是到底是多少?diocp3开源项目的一个装13测试(8W连接数) 测试DEMO路径 diocp3\samples\ECHO 之前群里说一台服务器最多是High(Word)的连接数655 ...
- 【Python成长之路】装逼的一行代码:快速共享文件
[Python成长之路]装逼的一行代码:快速共享文件 2019-10-26 15:30:05 华为云 阅读数 335 文章标签: Python编程编程语言程序员Python开发 更多 分类专栏: 技术 ...
- Python的regex模块——更强大的正则表达式引擎
Python自带了正则表达式引擎(内置的re模块),但是不支持一些高级特性,比如下面这几个: 固化分组 Atomic grouping 占有优先量词 Possessive quantifi ...
- Python代码这样写更优雅(转)
1.变量交换 大部分编程语言中交换两个变量的值时,不得不引入一个临时变量: >>> a = 1>>> b = 2>>> tmp = a>&g ...
- Python的平凡之路(13)
一.Python的paramiko模块介绍 Python 的paramiko模块,该模块和SSH用于连接远程服务器并执行相关操作 SSH client 用于连接远程服务器并执行基本命令 基于用户名和密 ...
随机推荐
- js循环中reduce的用法简单介绍
reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引 ...
- 逍遥自在学C语言 | 关系运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...
- 超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!
我们都知道 Spock 是一个单测框架,其特点是语法简明.但当我们使用 Spock 写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分 ...
- Dotnet初探: 尝试使用 dotnet6 的miniapi
引子 最近我们学校要求我们使用dotnet实现一个登录功能,由于我们学校的教程老旧(万年经典asp .net 4.x,慢的要死),我看有高性能又免费的Dotnet6不用,还又要退回几年前,于是决定另开 ...
- 【Vue2.x源码系列07】监听器watch原理
上一章 Vue2计算属性原理,我们介绍了计算属性是如何实现的?计算属性缓存原理?以及洋葱模型是如何应用的? 本章目标 监听器是如何实现的? 监听器选项 - immediate.deep 内部实现 初始 ...
- vivo 推送系统的容灾建设与实践
作者:vivo 互联网服务器团队 - Yu Quan 本文介绍了推送系统容灾建设和关键技术方案,以及实践过程中的思考与挑战. 一.推送系统介绍 vivo推送平台是vivo公司向开发者提供的消息推送服务 ...
- 数据分析01-(numpy概述及使用)
数据分析-01 数据分析 numpy numpy概述 numpy`历史` numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 nd ...
- [OpenCV-Python] 17 形态学转换
文章目录 OpenCV-Python:IV OpenCV中的图像处理 17 形态学转换 17.1 腐蚀 17.2 膨胀 17.3 开运算 17.4 闭运算 17.5 形态学梯度 17.6 礼帽 17. ...
- Stream方法的介绍
文章目录 前言 Lambda表达式 格式 函数式接口 Stream的方法介绍 forEach filter collect count sum limit 和skip groupingBy reduc ...
- C++ Primer 5th Edition, Chapter 2, Solutions
Exercise 2.1 Questions What are the differences between int, long, long long, and short? Between an ...