首页 > 编程语言 >Python日志管理之Loguru

Python日志管理之Loguru

时间:2024-05-07 10:57:12浏览次数:26  
标签:自定义 Loguru Python add file 日志 logger log

1.安装

pip install loguru

2.快速使用

from loguru import logger

logger.add("my_log.log", rotation="10 MB")  # 自动分割日志文件
logger.info("这是一个信息级别的日志")

3.日志器配置方式

1.导入即用 from loguru import logger,有且只有1个日志器对象,简化配置复杂性
2.日志器配置方式只有1种 logger.add(...),直接配置日志输出位置、格式、过滤条件、级别、滚存行为
3.为不同的日志输出位置,多次执行 logger.add(...),支持标准输出/错误、本地文件、网络位置

from loguru import logger

# 导入即用,有且只有1个日志器对象,简化配置复杂性
logger.debug("That's it, beautiful and simple logging!")

# 只有1种配置方式,直接配置日志输出位置(sink)、格式(format)、过滤条件(filter)、级别(level)、滚存行为(rotation)
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")

# 可选按文件大小、时间
logger.add("file_1.log", rotation="500 MB")    # Automatically rotate too big file
logger.add("file_2.log", rotation="12:00")     # New file is created each day at noon
logger.add("file_3.log", rotation="1 week")    # Once the file is too old, it's rotated

# 对滚存后的旧日志文件,可选进一步配置保留/清理方式、压缩方式
logger.add("file_X.log", retention="10 days")  # Cleanup after some time
logger.add("file_Y.log", compression="zip")    # Save some loved space

4.日志级别及自定义日志级别

TRACE:新增级别,用于开发和调试阶段跟踪执行流程和更详细的变量信息,相当有用
DEBUG
INFO
SUCCESS:新增,这个成功的语义更加明确,按需选择
WARNING
ERROR
CRITICAL
另外,还支持自定义级别 new_level = logger.level("SNAKY", no=38, color="<yellow>", icon="") logger.log("SNAKY", "Here we go!")

5.自定义字段、过滤条件

1.自定义字段,就像日志器默认的时间、模块、函数、级别等字段,我们也可以自定义像来访IP、用户ID等字段,这些字段都统一保存在record['extra']的字典里
2.自定义字段,还可以结合过滤条件使用,其中1种应用就是实现以前logging不同日志器输出到不同文件的效果

# 静态绑定自定义字段

## 在配置格式时,加入自定义字段的占位字符串
logger.add("file.log", format="{extra[ip]} {extra[user]} {message}")

## 给日志器绑定自定义字段
context_logger = logger.bind(ip="192.168.0.1", user="someone")

## 使用绑定自定义字段的日志器
context_logger.info("Contextualize your logger easily")

## 修改绑定的自定义字段-方式1
context_logger.bind(user="someone_else").info("Inline binding of extra attribute")
## 修改绑定的自定义字段-方式2
context_logger.info("Use kwargs to add context during formatting: {user}", user="anybody")

## 如果上面写法太麻烦,可以采用with关键字+contextualize方法简写绑定方式:
with logger.contextualize(task=task_id):
    do_something()
    logger.info("End of task")


================================================
# 动态绑定自定义字段

## patch方法支持动态绑定自定义字段取值,比如当前时间
logger.add(sys.stderr, format="{extra[utc]} {message}")
logger = logger.patch(lambda record: record["extra"].update(utc=datetime.utcnow()))
================================================
# 自定义字段 -> 过滤条件

## 过滤含special自定义字段的日志到special.log中
logger.add("special.log", filter=lambda record: "special" in record["extra"])
## 这条日志没有绑定special字段,不会写入special.log
logger.debug("This message is not logged to the file")
## 这条日志绑定了special字段,会写入special.log
logger.bind(special=True).info("This message, though, is logged to the file!")

6.装饰器方式捕获并日志异常

from loguru import logger

@logger.catch
def my_function(x, y, z):
    # An error? It's caught anyway!
    return 1 / (x + y + z)

7.多协程、多线程、多进程安全

废话,logging本身就是线程安全的,loguru当然也是
废话,线程都安全了,协程能不安全吗
多进程安全,是我喜欢它的另外一个理由
线程池、进程池中使用时,注意如果使用了logger.add(...),为避免重复配置而导致的重复日志,请在前面加上logger.remove()清除配置,否则线程、进程是复用的,提交1次任务就重复配置1次,提交1次就重复配置1次,...

from loguru import logger

@logger.catch
def train_ps():
    logger.remove()
    logger.add('logs/train.log', rotation='2 weeks')
    ...

8.异步日志解决性能损耗

当磁盘IO很高、网络有延迟时,日志本身可能就会成为程序的性能损耗点
另外多线程、多进程写入相同日志文件时,锁的问题,也会导致程序的性能损耗
Loguru非常贴心地提供了enqueue参数,直接通过消息队列的方式,实现异步日志

logger.add("somefile.log", enqueue=True)

9.其他

1.日志输出到终端时,可配置颜色
logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")


2.日志异常时,支持记录详细到变量值的异常栈,注意可能会在日志中泄露敏感数据
logger.add("out.log", backtrace=True, diagnose=True)

def func(a, b):
    return a / b

def nested(c):
    try:
        func(5, c)
    except ZeroDivisionError:
        logger.exception("What?!")

nested(0)
---
2018-07-17 01:38:43.975 | ERROR    | __main__:nested:10 - What?!
Traceback (most recent call last):

  File "test.py", line 12, in <module>
    nested(0)
    └ <function nested at 0x7f5c755322f0>

> File "test.py", line 8, in nested
    func(5, c)
    │       └ 0
    └ <function func at 0x7f5c79fc2e18>

  File "test.py", line 4, in func
    return a / b
           │   └ 0
           └ 5

ZeroDivisionError: division by zero

3.支持序列化成JSON格式,再输出到日志位置
logger.add(custom_sink_function, serialize=True)

抄自于:https://www.toutiao.com/article/7353288382568841766

 

标签:自定义,Loguru,Python,add,file,日志,logger,log
From: https://www.cnblogs.com/panwenbin-logs/p/18176717

相关文章

  • Ranorex日志备份
    1.简要由于我这里设置了定期删除日志文件,有关一些测试成功的日志报告就需要我们提前保存!请同时备份rxlog和data文件!!!2.复原2.1复原并不是放在项目根目录下的reports文件夹中,注意到这里都只是快捷方式2.2应当放到bin>debug>Reports>2024...下,这里的实际日期......
  • Python模块request去掉headers里请求content-length
    前言全局说明Python模块request去掉headers里请求content-length一、说明当request请求data有参数时,会自动计算长度,并增加content-length值,但有些服务器不接收这样的参数就可能会报错。二、网上方法:2.1requests去掉headers里的content-length来源:https://blog......
  • python测试单元unittest
    深入理解Python单元测试——unittest库的全面指南-知乎(zhihu.com)参考这位博主的python单元测试python里面的unittest库是自带的所以我们直接创建pythonfile选择pythonunittest进行创建之后就会出现测试模块;  第一个框框代表需要测试的函数第二个框框代表测试数据......
  • 1.python标准库概览
    python3标准库中的模块os模块:os模块提供了很多与操作系统交互的函数,例如创建、移动、删除文件和目录,以及访问环境变量等sys模块:sys模块提供了与python解释器和系统相关的功能,例如解释器的版本和路径,以及stdin、stdout、stderr相关的信息time模块:time模块提供了处理时间的函......
  • Logback日志框架
    简介Logback是一个成熟和稳定的日志框架,是Log4j框架的继承者,具有更好的性能和更加丰富的配置选项。它可以与SpringBoot框架集成,实现日志输出到控制台或者文件。基本概念Logback由三个模块组成logback-core:提供了更低级别的功能,最基本的日志系统。logback-classic:提供了更高......
  • Python基础知识——缩进、标识符、保留字
    标识符标识符就是程序中,使用的各种名称,例如:变量名、常量名、类名等等。在Python中,对标识符格式的要求与C/C++、Java等差不多:第一个字符必须是字母表中的字母或下划线_;标识符的其他的部分,由字母、数字和下划线组成;标识符对大小写敏感;标识符不能与保留字相同。比如:nu......
  • 代理 mitmproxy Python非命令行启动 使用笔记(一)
    代理mitmproxyPython非命令行启动使用笔记(一)mitmproxyPython非命令行启动在进行APP应用操作时,难免会遇到抓包操作,于是我们这里使用mitmproxy来完成这能力目录mitmproxy简介mitmproxy常用的命令行启动mitmproxy非命令行脚本直接启动,两种方式简介mitmproxy是......
  • GUI利器 python界面开发PySimpleGUI
    大家好,很多人都想写一个自己的桌面程序,那么PySimpleGUI 是一个非常好的选择,它旨在简化GUI(图形用户界面)的创建过程。它基于几种流行的PythonGUI库,如tkinter、Qt、WxPython和Rem)i,但提供了一个更简单直观的接口。通过PySimpleGUI,即使是没有图形界面开发经验的开发者也可以......
  • 一个惊艳的 python 库:PyWebIO,用 Python 写网站
    大家好,今天给大家介绍另一个简单而强大的web库--PyWebIO,它能让你的Python脚本快速拥有一个交互式的网页界面。想象一下,你不需要懂得前端开发,就能创建出用户友好的网页应用,今天,我们就来聊聊PyWebIO,看看它如何让Pythonweb开发变得更加简单有趣。为什么选择PyWebIO?1. 快速开发......
  • python实战练习题二
    """第一题:求解回文字符串回文是一个正读和反读都一样的字符串。例如:abcba12321是回文字符串hello123456不是回文字符串"""s=input("请输入字符串:")s2=s[::-1]#字符串逆序ifs==s2:print("{}是回文字符串!".format(s))else:pr......