Python-loguru-库基本使用

Loguru 包 Github 仓库地址
Loguru 包官方文档

介绍

Loguru 提供了一个简单的方式输出日志信息. 其仅提供 logger 一个接口处理所有内容.

安装

1
pip install loguru

基本使用

1
2
3
4
5
6
7
8
from loguru import logger

# 输出不同级别的日志信息
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")

添加 Handler

Handler 可定义日志输出位置, 输出格式 (formatter), 指定对哪些 logger 起作用 (filter), 以及大体指定起作用的 log level (指定的 level 及其以上都会被作用到, filter 在其下再过滤).

一个基本示例:

1
2
3
4
5
6
7
8
9
10
from loguru import logger

# 添加一个文件处理器,输出到 hello.log
logger.add("hello.log", level="DEBUG", filter=lambda record: record["level"].name == "INFO")

# 测试日志
logger.debug("这是一条调试信息")
logger.info("这是一条信息")
logger.warning("这是一条警告信息")
logger.error("这是一条错误信息")

这里添加了一个 handler:

  • 输出到 hello.log 文件
  • DEBUG level 以上的日志输出起作用
  • filter, 表明只对 INFO level 起作用

下面给一个设置 format 的示例:

1
2
3
4
5
6
7
from loguru import logger
import sys

logger.remove(0)
logger.add(sys.stderr, level='INFO', format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{line} - {message}")

logger.info("This is an info message.")

输出为:

1
2024-09-13 14:22:23 | INFO | table:6 - This is an info message.

这里有几个格式化占位符需要注意:

  • {time}: 日志记录的时间. 你可以自定义时间格式, 例如: {time:YYYY-MM-DD HH:mm:ss}: 输出为 2024-09-13 12:34:56
  • {level}: 日志级别 (如 DEBUG, INFO, WARNING, ERROR, CRITICAL)
  • {message}: 日志消息的内容
  • {name}: 日志记录器的名称
  • {module}: 记录日志的模块名称
  • {function}: 记录日志的函数名称
  • {line}: 记录日志的代码行号
  • {process}: 进程 ID
  • {thread}: 线程 ID

这些也可以用在指定输出的位置, 如:

1
logger.add("file_{time}.log")

移除 Handler

在用 add() 添加 handler 时, 会返回一个 id 值用于指定 handler. 默认的 handler id 为 0, 也可以移除:

1
2
3
4
5
from loguru import logger

logger.remove(0)

logger.debug("hello?")

会没有任何输出. (毕竟被移除了)

另一个示例:

1
2
3
4
5
6
7
from loguru import logger

new_handler_id = logger.add("hello.log", level="debug")

logger.remove(new_handler_id)

logger.debug("Still default one!")

Rotation, Retention 以及 compression

Log rotation, 日志文件达到一定大小或时间后, 自动创建新的日志文件并将旧的日志文件保存或归档的过程.

Log retention, 决定保留多长时间的日志文件以及在何种情况下删除旧日志.

Log compression, 指在轮换或保留日志时, 对旧日志文件进行压缩.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
from loguru import logger
import time

# 配置日志
logger.add("my_log.log",
rotation="1 MB", # 当日志文件达到 1 MB 时进行轮换
retention="7 days", # 保留最近 7 天的日志
compression="zip") # 对旧日志进行压缩,使用 zip 格式

# 生成日志
for i in range(20000):
logger.info(f"This is log message number {i}")

错误处理

可以用 @logger.catch 修饰器来捕获函数的报错:

1
2
3
4
5
6
7
8
from loguru import logger

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

my_function(0,0,0)

(输出效果更好)

详细错误跟踪

1
2
3
4
5
6
7
8
9
10
11
12
13
# Caution, "diagnose=True" is the default and may leak sensitive data in prod
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)

颜色设置

如:

1
logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")
  • <color></color> 包裹想要高亮的信息

自定义 levels

logger.level() 来创建, 如:

1
2
3
new_level = logger.level("SNAKY", no=38, color="<yellow>", icon="🐍")

logger.log("SNAKY", "Here we go!")

结合 notifier

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import notifiers

params = {
"username": "you@gmail.com",
"password": "abc123",
"to": "dest@gmail.com"
}

# Send a single notification
notifier = notifiers.get_notifier("gmail")
notifier.notify(message="The application is running!", **params)

# Be alerted on each error message
from notifiers.logging import NotificationHandler

handler = NotificationHandler("gmail", defaults=params)
logger.add(handler, level="ERROR")

在遇到 ERROR level 的报错时, 发送邮件到指定位置.


Python-loguru-库基本使用
http://example.com/2024/09/13/Python-loguru-库基本使用/
作者
Jie
发布于
2024年9月13日
许可协议