当前位置: 首页 > news >正文

python 日志库loguru

python 日志库loguru

安装

pip install loguru

最简单的基本使用

from loguru import loggerlogger.success("Hello from success!")
logger.info("Hello from info!")
logger.debug("Hello from debug!")
logger.warning("Hello from warning!")
logger.error("Hello from error!")
# 严重错误
logger.critical("Hello from critical!")

输出结果

image-20241010150939431

自定义日志处理器(输出样式, 显示日志等级, 输出方式等)

import sysfrom loguru import logger# 移除默认的日志处理器, 否则会重复输出
logger.remove()
# 添加一个自定义日志处理器
logger.add(sys.stdout,format="<green>{time:YYYYMMDD HH:mm:ss}</green> | "  # 颜色>时间"{process.name} | "  # 进程名"{thread.name} | "  # 进程名"<level>{module}</level>.<cyan>{function}</cyan>"  # 模块名.方法名":<cyan>{line}</cyan> | "  # 行号"<level>{level}</level>: "  # 等级"<level>{message}</level>",  # 日志内容# 可选值: TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL# 越后的值, 显示的日志越少level='TRACE')def main():logger.success("Hello from success!")logger.info("Hello from info!")logger.debug("Hello from debug!")logger.warning("Hello from warning!")logger.error("Hello from error!")logger.critical("Hello from critical!")if __name__ == '__main__':main()

image-20241010152344370

使用配置方式定义

import sysfrom loguru import loggerconfig = {"handlers": [{"sink": sys.stdout,"format": "<green>{time:YYYYMMDD HH:mm:ss}</green> | "  # 颜色>时间"{process.name} | "  # 进程名"{thread.name} | "  # 进程名"<level>{module}</level>.<cyan>{function}</cyan>"  # 模块名.方法名":<cyan>{line}</cyan> | "  # 行号"<level>{level}</level>: "  # 等级"<level>{message}</level>",  # 日志内容"level": 'TRACE'},{"sink": "loguru.log",  # 日志文件名"rotation": "1 week",  # 按周滚动"retention": "10 days",  # 保留10天"enqueue": True,  # 异步写入"compression": "zip",  # 压缩格式"serialize": True  # 序列化日志为json格式},],"extra": {"user": "Tiam"}
}
logger.configure(**config)

保存日志文件

from loguru import logger# 添加一个文件日志处理器, 指定日志等级, 日志文件名, 日志文件大小, 日志文件数量, 日志文件切割方式# 添加 compression="zip" 参数, 可以压缩日志文件
# logger.add("file.log", level="INFO", rotation="10 KB", compression="zip")# 日志文件每达到 10 KB 时, 会自动切割
logger.add("file.log", level="INFO", rotation="10 KB")def main():logger.success("Hello from success!")logger.info("Hello from info!")logger.debug("Hello from debug!")logger.warning("Hello from warning!")logger.error("Hello from error!")logger.critical("Hello from critical!")if __name__ == '__main__':for i in range(100):main()

image-20241010153527349

线程异常捕获

import threading
from concurrent.futures import ThreadPoolExecutorfrom loguru import logger@logger.catch
def thread_task():print(threading.current_thread().name)a = 1 / 0if __name__ == '__main__':with ThreadPoolExecutor(max_workers=1) as executor:executor.submit(thread_task)

@logger.catch 会捕获打印完整的异常信息以及堆栈信息,

如果没有@logger.catch 注解将不会抛出任何错误, 因为没有调用未来对象的返回结果(退出代码返回0)

image-20241016210044554

使用logger.exception()方法,可以打印出异常的堆栈信息, logger.error 只能记录信息

def main():try:a = 1 / 0except:# 使用logger.exception()方法,可以打印出异常的堆栈信息logger.exception("这里出现了异常")

image-20241016210759660

多任务/多线程日志

多任务时, 分任务写入不同文件

from loguru import loggerlogger.add("file_A.log", filter=lambda record: record["extra"]["task"] == "A")
logger.add("file_B.log", filter=lambda record: record["extra"]["task"] == "B")def task_a():logger_a = logger.bind(task="A")logger_a.info("Task A")def task_b():logger_b = logger.bind(task="B")logger_b.info("Task B")task_a()
task_b()

多线程, 为每个线程分配一个日志文件

import copy
import time
from concurrent.futures import ThreadPoolExecutorfrom loguru import loggerlogger.remove()def task(task_id, logger):logger.info("Starting task {}", task_id)# do somethingtime.sleep(3)logger.success("End of task {}", task_id)tasks = ["A", "B", "C", "D", "E"]
with ThreadPoolExecutor(max_workers=len(tasks)) as executor:for task_id in tasks:# 深拷贝一个新的logger对象logger_ = copy.deepcopy(logger)# 给新的logger对象添加一个文件输出logger_.add("file_%s.log" % task_id)# 后续使用新的logger进行日志记录executor.submit(task, task_id, logger_)

与进度条tqdm

这里配置使用 tqdm.write作为日志输出

from tqdm import tqdm
from loguru import logger
import timelogger.remove()
logger.add(lambda msg: tqdm.write(msg, end=""), colorize=True)logger.info("Initializing")for x in tqdm(range(100)):logger.info("Iterating #{}", x)time.sleep(0.1)

image-20241016233428163

这是不使用tqdm.write的输出效果, em…没体会到作用…

image-20241016233516903

参考:

  • 与tqDM一起使用· 议题 #135 · Delgan/loguru — Usage with tqdm · 议题 #135 · Delgan/loguru (github.com)
  • loguru的代码片段和食谱- loguru文档 — Code snippets and recipes for loguru — loguru documentation

自定义日志等级

from loguru import logger
from functools import partialmethodlogger.level("simple", no=33, icon="🤖", color="<fg #b168f2>")logger.__class__.simple = partialmethod(logger.__class__.log, "simple")
logger.log("simple", "A message")
logger.simple("A message")

更多颜色可选值: loguru.logger — loguru documentation

icon=“🤖”, color=“<fg #b168f2>”)

logger.class.simple = partialmethod(logger.class.log, “simple”)
logger.log(“simple”, “A message”)
logger.simple(“A message”)


更多颜色可选值: [loguru.logger — loguru documentation](https://loguru.readthedocs.io/en/stable/api/logger.html#color)更多: [Overview — loguru documentation](https://loguru.readthedocs.io/en/stable/overview.html)
http://www.lryc.cn/news/461594.html

相关文章:

  • 基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现
  • Chrome谷歌浏览器加载ActiveX控件之JT2Go控件
  • Java基础概览和常用知识(七)
  • STL-string
  • 数据库基础-学习版
  • 【Gin】Gin框架介绍和使用
  • AI大模型带来哪些创业机遇?
  • [Linux] 层层深入理解文件系统——(3)磁盘组织存储的文件
  • Apache Cordova学习计划
  • Unity学习日志-API
  • Java基础常见面试题总结(上)
  • 4 -《本地部署开源大模型》在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型
  • 本地如何使用Pycharm连接远程服务器调试torchrun
  • Visual Studio 2022常用快捷键
  • mysql innodb 引擎如何直接复制数据库文件?
  • python中的global和nonlocal关键字以及闭包和模块
  • LabVIEW风机滚动轴承监测系统
  • 第1节 什么是鸿蒙系统
  • CentOS 7 将 YUM 源更改为国内镜像源
  • python调用dircmp进行文件夹比较
  • 微信小程序 - 供应链系统设计
  • 嵌入式学习-IO进程-Day03
  • docker安装elasticsearch和ik分词器
  • |智能门票|008_django基于Python的智能门票设计与实现2024_i16z2v70
  • QFramework v1.0 使用指南 更新篇:20240919. 新增 BindableDictionary
  • vue实现文件预览和文件上传、下载、预览——多图、模型、dwg图纸、文档(word、excel、ppt、pdf)
  • 探讨人工智能领域所需学习的高等数学知识及其应用场景,涵盖了微积分、线性代数、概率论等多个数学分支。
  • 详解安卓和IOS的唤起APP的机制,包括第三方平台的唤起方法比如微信
  • 服务器数据恢复—raid5阵列中多块硬盘离线导致崩溃的数据恢复案例
  • 《深度学习》OpenCV FisherFaces算法人脸识别 原理及案例解析