使用loguru优雅的输出日志
快速上手
安装
pip install loguru
初次使用
from loguru import logger
logger.debug("That's it, beautiful and simple logging!")
进阶用法
配置日志格式
import sys
from loguru import logger
#配置日志格式、默认日志级别level
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
logger.info("That's it, beautiful and simple logging!")
logger.debug("That's debug")
logger.warning("That's warning")
日志文件
如果要将记录的消息保存到文件,则只需使用字符串路径作为接收器。
logger.add("file_{time}.log")
日志文件分隔、保留时间、压缩格式
如果需要设置日志文件大小、删除较旧的日志文件或希望节省存储空间,并设置压缩格式,这些都可以进行配置,而且配置起来非常简单。如下
# rotation参数
logger.add("file_{time}.log", rotation="500 MB") # 超过500MB 新创建一个log 文件
logger.add("file_{time}.log", rotation="12:00") # 每天中午12点创建一个新的日志文件
logger.add("file_{time}.log", rotation="1 week") # 每隔一个周新创建一个log 文件
# retention参数
logger.add("file_X.log", retention="10 days") # 日志文件最长保留 10 天
# compression参数
logger.add("file_Y.log", compression="zip") # 使用zip文件格式保存
保留时长也可以是一个 datetime.timedelta 对象,比如设置日志文件最多保留 5 个小时
import datetime
from loguru import logger
logger.add('runtime_{time}.log', retention=datetime.timedelta(hours=5))
异常追溯(Traceback捕获)
您是否曾经看到程序意外崩溃而没有在日志文件中看到任何内容?您是否注意到没有记录线程中发生的异常?这可以使用[catch()装饰器/上下文管理器解决,该管理器可以确保将任何错误信息正确保存到logger中。配置如下:
import sys
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(1,-1,0)
色彩斑斓的日志(目前用不到)
如果您的终端兼容,Loguru会自动为日志添加颜色。您可以通过使用接收器格式来自定义自己喜欢的样式。配置方式如下:
logger.add(sys.stdout,
colorize=True,
format="<green>{time}</green> <level>{message}</level>")
logger.add('logs/z_{time}.log',
level='DEBUG',
format='{time:YYYY-MM-DD :mm:ss} - {level} - {file} - {line} - {message}',
rotation="10 MB")
异步写入日志
默认情况下,添加到
logger中的日志信息都是线程安全的。但这并不是多进程安全的,我们可以通过添加enqueue参数来确保日志完整性。如果我们想要在异步任务中使用日志记录的话,也是可以使用同样的参数来保证的。并且通过
complete()来等待执行完成。
# 异步写入
logger.add("somefile.log", enqueue=True)
配置编码格式-encoding
logger.add(log_file_path, rotation="500 MB", encoding='utf8')
通知机制
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")
要点解析
介绍,主要函数的使用方法和细节 - add()的创建和删除
add() - 非常重要的参数 sink 参数
可以传入一个
file对象例如
sys.stderr或者open('file.log', 'w')都可以
可以直接传入一个
str字符串或者pathlib.Path对象代表文件路径,会自动创建对应路径的日志文件并将日志输出进去
另外添加
sink之后我们也可以对其进行删除,相当于重新刷新并写入新的内容。删除的时候根据刚刚add方法返回的id进行删除即可。from loguru import logger trace = logger.add('runtime.log') logger.debug('this is a debug message') logger.remove(trace) logger.debug('this is another debug message')
可以发现,在调用
remove方法之后,确实将历史log删除了。但实际上这并不是删除,只不过是将sink对象移除之后,在这之前的内容不会再输出到日志中,这样我们就可以实现日志的刷新重新写入操作
参考
官方文档: https://loguru.readthedocs.io/en/stable/overview.html
官方github: https://github.com/Delgan/loguru