Python loguru库


前言

单纯的使用python自带的print函数只能在控制台看到用户指定的输出结果,但是,print函数弊端十分明显,它不能很好的输出运行的时间,并且当前运行的module、function、行号都无法用print函数很方便的打印输出,最重要的是,如果想要将打印输出的内容输出到日志文件,操作起来就变得十分棘手。
引入日志功能,不但可以很好的解决上述print函数的各种问题,而且loguru这个库提供了十分方便的使用方案,十分容易上手。

一、loguru库的使用:

python自带了logging的模块,但是需要进行复杂的配置才能很好的使用,也是与我们的初心相违背。使用loguru库可以进行简单的配置完成用户的需求。

  • 安装loguru模块
pip install loguru
  • 举一个简单的例子:
from loguru import logger
logger.info('Hello world!')
  • 执行结果:
2024-02-04 13:48:37.575 | INFO     | __main__:<module>:21 - Hello world!
  • 输出到日志文件:
from loguru import logger

logger.add("日志文件.log")
logger.success("成功写入日志文件!")
  • 优雅的loguruformat格式:
# 相对位置 ./logs/日志文件.log
logger.add(sink=os.path.join("logs", '日志文件.log'),
               format=r"{time:YYYY-MM-DD HH:mm:ss} | "
                      "{level: <5} \t| "
                      "{module}.{function}:{line} - {message}",
               encoding="utf-8", level="INFO", enqueue=True, retention="10 days")

二、日志层级(Level):

Loguru提供了七层日志层级,或者说七种日志类型。

生产环境中,常常在不同场景下使用不用的日志类型,用于处理各种问题。

每种类型的日志有一个整数值,表示日志层级,我们成为log level no。

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

在终端上,可以看到不同类型的日志,已经有不同的颜色加以区分,默认的配置已经很方便的让我们识别和使用了。

输出不包括TRACE级别的日志信息。这是因为Loguru默认使用DEBUG作为其最低日志级别,导致任何严重性低于DEBUG的日志信息都会被忽略。 如果您想更改默认级别,可以使用下面所示的add()方法的级别参数:

# 修改logger的最低日志级别,大于等于INFO才记录日志
logger.add(level="INFO")

三、处理日志的方法add():

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

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

一个完整的配置:

logger.add(
    sink="./logs/app.log",
    enqueue=True,
    rotation="4 weeks",
    retention="4 months",
    encoding="utf-8",
    backtrace=True,
    diagnose=True,
    compression="zip",
)

add函数参数的完整解释:

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

四、异常捕获

from loguru import logger

@logger.catch()
def e_test():
    a = 1 / 0


if __name__ == '__main__':
    logger.add(sink=os.path.join("logs", '日志文件.log'),
               format=r"{time:YYYY-MM-DD HH:mm:ss} | "
                      "{level: <5} \t| "
                      "{module}.{function}:{line} - {message}",
               encoding="utf-8", level="INFO", enqueue=True)
    e_test()

日志输出:

2024-02-66 14:47:12 | ERROR 	| logger_test.<module>:31 - An error has been caught in function '<module>', process 'MainProcess' (4988), thread 'MainThread' (11372):
Traceback (most recent call last):

> File "E:\Coding\Pycharm\logger_test.py", line 31, in <module>
    e_test()<function e_test at 0x0000021B6EA144C0>

  File "E:\Coding\Pycharm\logger_test.py", line 22, in e_test
    a = 1 / 0

ZeroDivisionError: division by zero

参考文章

Python日志库Loguru教程(最人性化的Python日志模块)


  目录