一、背景介绍
loguru是python中除了官方logging模块外最受欢迎的第三方python日志模块。写这篇博客的时候,loguru在GitHub上已经取得了21.8K个star的成绩。
logging作为官方日志支持虽然功能非常强大,但是需要一定的配置,例如日志输出格式等等。
而loguru旨在为开发者提供开箱即用的体验。正如仓库介绍中写的,Python logging made (stupidly) simple。
那么本文就是探索,怎么方便的在有多个功能模块的系统中,使用loguru管理所有的日志文件。
我希望使用一个python文件完成所有模块的日志配置,并且在对应模块要记录日志的时候导入我们定义的logger就可以将日志以指定格式记录到指定日志文件。
二、实际操作
创建上图的目录结构。
现在,我想在log.py中配置全部的logger,module1使用一个logger1,module2使用一个logger2,并且他们分别写入各自的log文件中。
log.py
from loguru import logger
logger.add(
"/home/tqn/logurutest/logs/module1.log",
filter=lambda record: record["extra"]["name"] == "module1",
retention="7 days",
rotation="10 MB",
# format="",
)
logger.add(
"/home/tqn/logurutest/logs/module2.log",
filter=lambda record: record["extra"]["name"] == "module2",
)
logger1 = logger.bind(name="module1")
logger2 = logger.bind(name="module2")
在log.py中定义logger1,logger2,分别对应模块1和模块2,模块1使用logger1就会写入module1.log文件。
并且还设置了retention,7天之后会删除过时日志,rotation,日志文件超过10MB会换一个文件记录。还支持设置format,也就是日志的格式。
实现不同logger绑定不同日志文件的核心是filter。我们为module1.log设置了只有record["extra"]["name"] == "module1"的才能记录,并且为logger1绑定了属性name="module1",因此只有logger1才能写入module1.log文件。module2同理。
至于为什么是name,可不可以是其他的属性?这完全可以随便定义。重点是bind中的属性会被写入最后日志消息(json串)的extra当中,只要和filer匹配即可。
那么我们来测试一下。分别在func1.py和func2.py中写点日志。
func1.py
from config.log import logger1
logger1.info("这是模块1的INFO日志")
func2.py
from config.log import logger2
logger2.warning("这是模块2的WARNING日志")
分别运行一下。
控制台已经打印日志了,可以看到,info,waring日志有预设的颜色。
查看log文件,看到对应模块写入到对应的日志文件中了。
那么,我们的目标初步完成了,已经实现了不同模块使用不同logger写入不同log文件,并且所有的配置都可以在一个文件当中完成。