# 使用loguru优雅的输出日志 ### 快速上手 ##### 安装 ```python pip install loguru ``` ##### 初次使用 ```python from loguru import logger logger.debug("That's it, beautiful and simple logging!") ``` ### 进阶用法 ##### 配置日志格式 ```python 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") ``` ##### 日志文件 如果要将记录的消息保存到文件,则只需使用字符串路径作为接收器。 ```python logger.add("file_{time}.log") ``` ##### 日志文件分隔、保留时间、压缩格式 如果需要设置日志文件大小、删除较旧的日志文件或希望节省存储空间,并设置压缩格式,这些都可以进行配置,而且配置起来非常简单。如下 ```python # 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 个小时 ```python import datetime from loguru import logger logger.add('runtime_{time}.log', retention=datetime.timedelta(hours=5)) ``` ##### 异常追溯(Traceback捕获) 您是否曾经看到程序意外崩溃而没有在日志文件中看到任何内容?您是否注意到没有记录线程中发生的异常?这可以使用[`catch()`装饰器/上下文管理器解决,该管理器可以确保将任何错误信息正确保存到`logger`中。配置如下: ```python 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会自动为日志添加颜色。您可以通过使用接收器格式来自定义自己喜欢的样式。配置方式如下: ```python logger.add(sys.stdout, colorize=True, format="{time} {message}") 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()` 来等待执行完成。 ```python # 异步写入 logger.add("somefile.log", enqueue=True) ``` ##### 配置编码格式-encoding ```csharp logger.add(log_file_path, rotation="500 MB", encoding='utf8') ``` ##### 通知机制 ```python 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` 进行删除即可。 ```python 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