不想手动再配置logging?那可以试试loguru( 三 )

最后保存的日志都是序列化后的单条记录:
{"text": "2020-10-07 18:23:36.902 | INFO| __main__::6 - hello, world\n","record": {"elapsed": {"repr": "0:00:00.005412","seconds": 0.005412},"exception": null,"extra": {},"file": {"name": "log_test.py","path": "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py"},"function": "","level": {"icon": "\u2139\ufe0f","name": "INFO","no": 20},"line": 6,"message": "hello, world","module": "log_test","name": "__main__","process": {"id": 12662,"name": "MainProcess"},"thread": {"id": 4578131392,"name": "MainThread"},"time": {"repr": "2020-10-07 18:23:36.902358+08:00","timestamp": 1602066216.902358}}}4、异常追溯当异常和错误不可避免时 , 最好的方式就是让我们知道程序到底是哪里出了错 , 或者是因为什么导致错误 , 这样才能更好地让开发人员及时应对并解决 。
loguru 集成了一个名为 better_exceptions 的库 , 不仅能够将异常和错误记录 , 并且还能对异常进行追溯 , 这里是来自一个官网的例子
import osimport sysfrom loguru import loggerlogger.add(os.path.expanduser("~/Desktop/exception_log.log"), backtrace=True, diagnose=True)def func(a, b):return a / bdef nested(c):try:func(5, c)except ZeroDivisionError:logger.exception("What?!")if __name__ == "__main__":nested(0)最后在日志文件中我们可以得到以下内容:
2020-10-07 21:14:11.830 | ERROR| __main__:nested:16 - What?!Traceback (most recent call last):File "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py", line 20, in nested(0)└ > File "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py", line 14, in nestedfunc(5, c)│└ 0└ File "/Users/Bobot/PycharmProjects/docs-python/src/loguru/log_test.py", line 10, in funcreturn a / b│└ 0└ 5ZeroDivisionError: division by zero与 Logging 完全兼容(Entirely Compatible)尽管说 loguru 算是重新「造轮子」 , 但是它也能和 logging 库很好地兼容 。 到现在我们才谈论到 add() 方法的第一个参数 sink 。
这个参数的英文单词动词有「下沉、浸没」等意 , 对于外国人来说在理解上可能没什么难的 , 可对我们国人来说 , 这可之前 logging 库中的 handler 概念还不好理解 。 好在前面我有说过 , loguru 和 logging 库的使用上存在相似之处 , 因此在后续的使用中其实我们就可以将其理解为 handler , 只不过它的范围更广一些 , 可以除了 handler 之外的字符串、可调用方法、协程对象等 。
loguru 官方文档对这一参数的解释是:
An object in charge of receiving formatted logging messages and propagating them to an appropriate endpoint.
翻译过来就是「一个用于接收格式化日志信息并将其传输合适端点的对象」 , 进一步形象理解就像是一个「分流器」 。
import logging.handlersimport osimport sysfrom loguru import loggerLOG_FILE = os.path.expanduser("~/Desktop/testlog.log")file_handler = logging.handlers.RotatingFileHandler(LOG_FILE, encoding="utf-8")logger.add(file_handler)logger.debug("hello, world")当然目前只是想在之前基于 logging 写好的模块中集成 loguru , 只要重新编写一个继承自 logging.Handler 类并实现了 emit() 方法的 Handler 即可 。