“ 今天勇哥来介绍一款让日志记录在 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的更多相关文章

  1. python 冷知识(装13 指南)

    python 冷知识(装13 指南) list1 += list2 和 list1 = list1 + list2 的区别 alpha = [1, 2, 3] beta = alpha # alpha ...

  2. 分享一个撩妹、装13神技能,0基础用Python暴力破解WiFi密码

    WiFi密码Python暴力破解   Python密码破解部分截图 获取视频资料,转发此文+点击喜欢,然后获取资料请加Python交流群:580478401,就可以获取视频教程+源码 环境准备: py ...

  3. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  4. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  5. 【转】python:让源码更安全之将py编译成so

    python:让源码更安全之将py编译成so 应用场景 Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效. python的解释特性是将py编译为独有的二 ...

  6. diocp3-服务器的连接上限是到底是多少?diocp3的一个装13测试(8W连接数)

    服务器的连接上限是到底是多少?diocp3开源项目的一个装13测试(8W连接数) 测试DEMO路径 diocp3\samples\ECHO 之前群里说一台服务器最多是High(Word)的连接数655 ...

  7. 【Python成长之路】装逼的一行代码:快速共享文件

    [Python成长之路]装逼的一行代码:快速共享文件 2019-10-26 15:30:05 华为云 阅读数 335 文章标签: Python编程编程语言程序员Python开发 更多 分类专栏: 技术 ...

  8. Python的regex模块——更强大的正则表达式引擎

    Python自带了正则表达式引擎(内置的re模块),但是不支持一些高级特性,比如下面这几个: 固化分组    Atomic grouping 占有优先量词    Possessive quantifi ...

  9. Python代码这样写更优雅(转)

    1.变量交换 大部分编程语言中交换两个变量的值时,不得不引入一个临时变量: >>> a = 1>>> b = 2>>> tmp = a>&g ...

  10. Python的平凡之路(13)

    一.Python的paramiko模块介绍 Python 的paramiko模块,该模块和SSH用于连接远程服务器并执行相关操作 SSH client 用于连接远程服务器并执行基本命令 基于用户名和密 ...

随机推荐

  1. js循环中reduce的用法简单介绍

    reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引 ...

  2. 逍遥自在学C语言 | 关系运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...

  3. 超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!

    我们都知道 Spock 是一个单测框架,其特点是语法简明.但当我们使用 Spock 写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分 ...

  4. Dotnet初探: 尝试使用 dotnet6 的miniapi

    引子 最近我们学校要求我们使用dotnet实现一个登录功能,由于我们学校的教程老旧(万年经典asp .net 4.x,慢的要死),我看有高性能又免费的Dotnet6不用,还又要退回几年前,于是决定另开 ...

  5. 【Vue2.x源码系列07】监听器watch原理

    上一章 Vue2计算属性原理,我们介绍了计算属性是如何实现的?计算属性缓存原理?以及洋葱模型是如何应用的? 本章目标 监听器是如何实现的? 监听器选项 - immediate.deep 内部实现 初始 ...

  6. vivo 推送系统的容灾建设与实践

    作者:vivo 互联网服务器团队 - Yu Quan 本文介绍了推送系统容灾建设和关键技术方案,以及实践过程中的思考与挑战. 一.推送系统介绍 vivo推送平台是vivo公司向开发者提供的消息推送服务 ...

  7. 数据分析01-(numpy概述及使用)

    数据分析-01 数据分析 numpy numpy概述 numpy`历史` numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 nd ...

  8. [OpenCV-Python] 17 形态学转换

    文章目录 OpenCV-Python:IV OpenCV中的图像处理 17 形态学转换 17.1 腐蚀 17.2 膨胀 17.3 开运算 17.4 闭运算 17.5 形态学梯度 17.6 礼帽 17. ...

  9. Stream方法的介绍

    文章目录 前言 Lambda表达式 格式 函数式接口 Stream的方法介绍 forEach filter collect count sum limit 和skip groupingBy reduc ...

  10. C++ Primer 5th Edition, Chapter 2, Solutions

    Exercise 2.1 Questions What are the differences between int, long, long long, and short? Between an ...