Loguru--日志记录神器

Loguru:更为优雅、简洁的Python 日志管理模块

1、安装

  • 使用 pip 安装即可,Python 3 版本的安装如下:
pip3 install loguru

2、使用

(1)简单使用

我们直接通过导入loguru 封装好的logger 类的实例化对象,不需要手动创建 logger,直接进行调用不同级别的日志输出方法:

在生产环境中,常常在不同场景下使用不用的日志类型,用于处理各种问题。 每种类型的日志有一个整数值,表示日志层级,我们成为log level no。 loguru提供了七层日志层级,或者说七种日志类型:

  • TRACE (5): 用于记录程序执行路径的细节信息,以进行诊断。
  • DEBUG (10): 开发人员使用该工具记录调试信息。
  • INFO (20): 用于记录描述程序正常操作的信息消息。
  • SUCCESS (25): 类似于INFO,用于指示操作成功的情况。
  • WARNING (30): 警告类型,用于指示可能需要进一步调查的不寻常事件。
  • ERROR (40): 错误类型,用于记录影响特定操作的错误条件。
  • CRITICAL (50): 严重类型,用于记录阻止核心功能正常工作的错误条件。
from loguru import logger

class TestLoggerView(APIView):
    def get(self, request):
        logger.trace("This is trace message.")
        logger.debug('This is debug information')
        logger.info('This is info information')
        logger.success("This is success message.")
        logger.warning('This is warn information')
        logger.error('This is error information')
        logger.critical("This is critical message.")
        return Response('测试日志')

在这里插入图片描述

请注意,上述输出不包括TRACE级别的日志信息。这是因为Loguru默认使用DEBUG作为其最低日志级别,导致任何严重性低于DEBUG的日志信息都会被忽略。

(2)更改默认级别

如果您想更改默认级别,可以使用下面所示的add()方法的级别参数:

import sys
from loguru import logger

logger.remove(0)
logger.add(sys.stderr, level="INFO")

remove()方法被首先调用,以删除默认处理程序的配置(其ID为0)。然后,add()方法向记录器添加一个新处理程序。该处理程序将记录到标准错误,只记录INFO或更高级别的日志。

我们也可以自定义一个新的类型的日志,并赋予新的日志level no。但是默认的日志level已经够我们使用了,这里就不介绍了。

3、自定义输出日志的格式

(1)普通自定义

在日常使用中,如果默认的输出内容不够,我们也可以自定义日志的输出内容和格式,可以通过add()方法中的格式选项对Loguru生成的日志记录进行重新格式化。

Loguru 中的每条日志记录都是一个 Python 字典,其中包含其时间戳、日志级别等数据,可以使用loguru提供的格式化指令,包括或重新排列每条信息,如下所示:

import sys
from loguru import logger

logger.remove(0)
logger.add(sys.stderr, format="{time} | {level} | {message}")

logger.debug("Happy logging with Loguru!")

(2)json格式输出

除此之外,Loguru还通过其序列化选项支持JSON格式的结构化日志。这样就可以让我们以JSON格式输出日志,机器可以很容易地解析和分析它,因为每条记录中的信息将以键/值对的形式提供。

import sys
from loguru import logger

logger.remove(0)
logger.add(sys.stderr, format="{time:MMMM D, YYYY > HH:mm:ss!UTC} | {level} | {message}", serialize=True)
logger.debug("Happy logging with Loguru!")

json格式的输出:

在这里插入图片描述

4、将日志写入日志文件

(1)简单使用

  • logger 默认采用 sys.stderr 标准错误输出将日志输出到控制台中,假如想要将日志同时输出到其他的位置,比如日志文件,此时我们只需要使用一行代码即可实现。
  • 例如,将日志信息输出到 luffy1.log 文件中,可以这么写:
from loguru import logger

logger.add("D:\PyCharm 2023.2.1\workspace\luffy_api\logs\luffy1.log",rotation="500MB", encoding="utf-8", enqueue=True, retention="10 days")

logger.info('This is info information')
  • 控制台输出

在这里插入图片描述

  • luffy1.log

在这里插入图片描述

(2)使用add函数配置为一个文件

当add函数配置为一个文件时,add方法提供了更多选项来自定义日志文件的处理方式:

  • rotate:指定关闭当前日志文件并创建新文件的条件。此条件可以是 int、datetime 或 str,建议使用 str,因为它更易于阅读。
    • 如果是整数值,它对应于当前文件在创建新文件之前允许保留的最大字节数。
    • 如果是datetime.timedelta 值时,它指示每次旋转的频率,而 datetime.time 指定每个旋转应在一天中发生的时间。
    • 如果是str值,这是上述类型的变体。
  • retention:指定在从文件系统中删除每个日志文件之前如何保留日志。
  • compression:如果设置此选项,日志文件将转换为指定的压缩格式。
  • delay:如果设置为 True,则新日志文件的创建将延迟到推送第一条日志消息。
  • mode, buffering, encoding: 这些参数将被传递给 Python 的 open() 函数,该函数决定了 Python 将如何打开日志文件。

(3)add函数的其它参数

  • sink:为记录器生成的每条记录指定目的地。默认情况下,它设置为 sys.stderr。
  • level:指定记录器的最低日志级别。
  • format:用于为日志定义自定义格式。
  • filter:用于确定一条记录是否应该被记录。
  • colorize: 采用布尔值并确定是否应启用终端着色。
  • serialize:如果设置为 True,则日志记录以 JSON 格式呈现。
  • backtrace:确定异常跟踪是否应该延伸到捕获错误的点之外,以便于调试。 诊断:确定变量值是否应显示在异常跟踪中。您应该在生产环境中将其设置为 False 以避免泄露敏感信息。
  • diagnose: 确定变量值是否应在异常跟踪中显示。在生产环境中应将其设置为 False,以避免泄露敏感信息。
  • enqueue:启用此选项会将日志记录放入队列中,以避免多个进程记录到同一目的地时发生冲突。
  • catch:如果在记录到指定的接收器时发生意外错误,您可以通过将此选项设置为 True 来捕获该错误。错误将打印到标准错误。

5、将不同类型的日志记录到不同的文件中(add函数中的filter参数)

在上面的配置中,我们讲到,可以使用add函数来配置最小的日志级别,如果我们需要把不同的日志输出到不同的文件中,我们需要使用到filter参数:

import sys
from loguru import logger

def level_filter(level):
    def is_level(record):
        return record["level"].name == level
    return is_level

logger.remove(0)
logger.add("./logs/app.log", filter=level_filter(level="WARNING"))

还可以使用lambda函数直接配置filter参数,一个完整的例子:

from loguru import logger

# 设置不同级别的日志输出文件
logger.add("debug.log", level="DEBUG", rotation="10 MB", filter=lambda record: record["level"].name == "DEBUG")
logger.add("info.log", level="INFO", rotation="10 MB", filter=lambda record: record["level"].name == "INFO")
logger.add("warning.log", level="WARNING", rotation="10 MB", filter=lambda record: record["level"].name == "WARNING")
logger.add("error.log", level="ERROR", rotation="10 MB", filter=lambda record: record["level"].name == "ERROR")
logger.add("critical.log", level="CRITICAL", rotation="10 MB", filter=lambda record: record["level"].name == "CRITICAL")

# 输出不同级别的日志消息
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

6、异常定位并记录

loguru还提供了非常方便的异常定位功能,可以直接使用catch闭包,然后把抛出异常的位置记录到日志中。

from loguru import logger

logger.add(sink='log.log')

@logger.catch
def my_function(x, y, z):
    return 1 / (x + y + z)

res = my_function(0,0,0)

输出如下:

> File "/var/folders/kb/0pw_yx2n75z8mlyzjk3mwlwc0000gn/T/ipykernel_85315/1609034425.py", line 9, in <module>
    res = my_function(0,0,0)<function my_function at 0x7fcce2170670>

  File "/var/folders/kb/0pw_yx2n75z8mlyzjk3mwlwc0000gn/T/ipykernel_85315/1609034425.py", line 7, in my_function
    return 1 / (x + y + z)
                │   │   └ 0
                │   └ 00

ZeroDivisionError: division by zero

7、loguru配置模版

folder_ = "./log/"
prefix_ = "polaris-"
rotation_ = "10 MB"
retention_ = "30 days"
encoding_ = "utf-8"
backtrace_ = True
diagnose_ = True

# 格式里面添加了process和thread记录,方便查看多进程和线程程序
format_ = '<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> ' \
            '| <magenta>{process}</magenta>:<yellow>{thread}</yellow> ' \
            '| <cyan>{name}</cyan>:<cyan>{function}</cyan>:<yellow>{line}</yellow> - <level>{message}</level>'

# 这里面采用了层次式的日志记录方式,就是低级日志文件会记录比他高的所有级别日志,这样可以做到低等级日志最丰富,高级别日志更少更关键
# debug
logger.add(folder_ + prefix_ + "debug.log", level="DEBUG", backtrace=backtrace_, diagnose=diagnose_,
            format=format_, colorize=False,
            rotation=rotation_, retention=retention_, encoding=encoding_,
            filter=lambda record: record["level"].no >= logger.level("DEBUG").no)

# info
logger.add(folder_ + prefix_ + "info.log", level="INFO", backtrace=backtrace_, diagnose=diagnose_,
            format=format_, colorize=False,
            rotation=rotation_, retention=retention_, encoding=encoding_,
            filter=lambda record: record["level"].no >= logger.level("INFO").no)

# warning
logger.add(folder_ + prefix_ + "warning.log", level="WARNING", backtrace=backtrace_, diagnose=diagnose_,
            format=format_, colorize=False,
            rotation=rotation_, retention=retention_, encoding=encoding_,
            filter=lambda record: record["level"].no >= logger.level("WARNING").no)

# error
logger.add(folder_ + prefix_ + "error.log", level="ERROR", backtrace=backtrace_, diagnose=diagnose_,
            format=format_, colorize=False,
            rotation=rotation_, retention=retention_, encoding=encoding_,
            filter=lambda record: record["level"].no >= logger.level("ERROR").no)

# critical
logger.add(folder_ + prefix_ + "critical.log", level="CRITICAL", backtrace=backtrace_, diagnose=diagnose_,
            format=format_, colorize=False,
            rotation=rotation_, retention=retention_, encoding=encoding_,
            filter=lambda record: record["level"].no >= logger.level("CRITICAL").no)

logger.add(sys.stderr, level="CRITICAL", backtrace=backtrace_, diagnose=diagnose_,
            format=format_, colorize=True,
            filter=lambda record: record["level"].no >= logger.level("CRITICAL").no)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值