Python 日志记录-loguru
使用logging模块时
用python写代码时,logging模块最基本的几行配置,如下:
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info('this is another debug message')
logger.warning('this is another debug message')
logger.error('this is another debug message')
logger.info('this is another debug message')
执行结果如下:
引言 loguru
如果想更简洁,可用loguru库
loguru默认的输出格式是上面的内容,有时间、级别、模块名、行号以及日志信息,不需要手动创建 logger,直接使用即可,另外其输出还是彩色的,看起来会更加友好。
官方文档
安装
pip install loguru
1
日志级别
Level name | Severity value | Logger method |
---|---|---|
TRACE | 5 | logger.trace |
DEBUG | 10 | logger.debug |
INFO | 20 | logger.info |
SUCCESS | 25 | logger.success |
WARNING | 30 | logger.warning |
ERROR | 40 | logger.error |
CRITICAL | 50 | logger.critical |
简单测试下
from loguru import logger
logger.debug("debug")
logger.info("info")
logger.success("success")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
12345678
输出结果
特性
简介
此函数应用于注册接收器,这些接收器负责管理使用记录字典上下文化的日志消息。接收器可以采用多种形式:简单函数、字符串路径、类似文件的对象、协程函数或内置处理程序。
请注意:可以使用remove()函数来删除以前添加的处理程序。
例子:
import sys
from loguru import logger
logger.add("test.log", format="{time} {level} {message}", filter="", level="INFO", encoding="utf-8")
logger.debug("debug")
logger.info("info")
logger.success("success")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
1234567891011
效果,输出日志到test.log文件
2022-07-27T17:14:36.393072+0800 INFO info
2022-07-27T17:14:36.394068+0800 SUCCESS success
2022-07-27T17:14:36.395066+0800 WARNING warning
2022-07-27T17:14:36.396063+0800 ERROR error
2022-07-27T17:14:36.397060+0800 CRITICAL critical
12345
rotation/retension/compression
官方介绍:loguru.logger — loguru documentation
rotation:指示何时应关闭当前记录的文件并创建新文件,可以是文件大小/每天的时间点/时间间隔等。
logger.add("test1.log", rotation="500 MB") # 日志文件超过500M创建新的文件
logger.add("test2.log", rotation="12:00") # 每天中午12点创建新的日志文件
logger.add("test3.log", rotation="1 week") # 当前使用的日志文件超过1周,创建新的日志文件
123
retension:指示合适应该删除旧文件。
logger.add("test4.log", retention="10 days") # 超过十天的日志文件删除
1
compression:日志文件在关闭时应转换为的压缩或归档格式。
logger.add("test5.log", compression="zip") # 日志文件关闭后,使用zip进行压缩
1
异常捕获
使用catch()装饰器或者上下文管理器可以捕获异常,确保任何错误都能够记录到log日志中。
装饰器
from loguru import logger
@logger.catch
def test(x, y, z):
return 1 / (x + y + z)
test(0, 1, -1)
1234567
上下文装饰器
from loguru import logger
def test(x, y, z):
return 1 / (x + y + z)
with logger.catch():
test(0, 1, -1)
12345678
输出结果
完全描述性异常
记录代码中发生的异常对于跟踪BUG非常重要,loguru允许显示整个堆栈跟踪(包括变量值)来帮助定位BUG原因。
logger.add("out.log", backtrace=True, diagnose=True) # Caution, may leak sensitive data in prod
def func(a, b):
return a / b
def nested(c):
try:
func(5, c)
except ZeroDivisionError:
logger.exception("What?!")
nested(0)
123456789101112
输出结果
自定义颜色
logger.add(sys.stdout, colorize=True, format="<red>{time}</red> <level>{message}</level>")
logger.debug("debug")
logger.info("info")
logger.success("success")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
1234567
输出结果
异步/线程安全/多进程安全
默认情况下,添加到log的所有接收器都是线程安全的,但他们不是多进程安全的。如果需要实现多进程安全,异步记录日志,需要添加一个enqueue参数:
logger.add("test.log", enqueue = True)
1
结构化日志记录
将消息转化为json字符串以便于传递或者解析,可以使用serialize来配置:
logger.add("test.log", serialize=True, encoding="utf-8")
logger.debug("debug")
logger.info("info")
logger.success("success")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
1234567
输出结果
{"text": "2022-07-28 11:25:44.434 | DEBUG | __main__:<module>:43 - debug\n", "record": {"elapsed": {"repr": "0:00:00.127658", "seconds": 0.127658}, "exception": null, "extra": {}, "file": {"name": "logutil.py", "path": "e:\\GitPorject\\ZanguS1\\ZanguRecorder\\common\\logutil.py"}, "function": "<module>", "level": {"icon": "
标签:__,name,loguru,Python,message,2022,日志,logger,07
From: https://www.cnblogs.com/hanfe1/p/16963151.html