python 更高效的日志记录工具: loguru¶
0 背景¶
日志记录是软件开发中的关键部分,它帮助开发者监控应用程序的运行状态,并在出现问题时进行故障排查。Python 的标准库中包含了一个名为 logging 的模块,它提供了一系列用于记录日志的工具。然而,logging 的配置过程可能既复杂又繁琐,每次写logging规则的时候我基本都会忘记, 因为很多时候涉及到日志的落盘 & 定时归档等一些其他的复杂的操作, 配置起来是真吊麻烦, 主要是经常忘。 此外,logging 在默认设置下的一些行为可能不符合所有项目的需求。
loguru是一个 Python 日志库,它提供了一种简单而友好的方法来处理日志记录。相比logging, 就是简单, 简单到一行配置的代码就能符合我的需求。loguru以其易用性和功能丰富性著称,它通过简单的 API,让日志记录变得直观和无痛。
当然, loguru非常适合于各种规模和复杂度的 Python 项目,无论是小型脚本还是大型应用程序, 在多线程中它也是线程安全的, 我们也无需担心在使用 loguru 进行日志记录时的线程安全问题。以下是一些常用的的应用场景:
- 调试和开发:在开发过程中,loguru 可以帮助追踪程序的执行流程和变量状态,从而简化调试过程。
- 错误跟踪:在生产环境中,loguru 可以记录异常和错误信息,帮助我们快速定位并解决问题, 这一点我觉得是非常好用的, 在日志中, 我们可以直观的看到报错的过程, 错误的变量是什么值, 都可以在日志中显示出来。
- 性能监控:通过记录关键操作的时间和结果,loguru 有助于分析和优化应用程序的性能。
- 用户行为分析:loguru 可用于记录用户在应用中的行为,从而帮助理解用户需求并改进产品。
那相比于logging, 也是有很明显的优势的:
- 易用性:loguru 的 API 更为简洁直观。它允许我们通过少量代码就可以实现日志记录,而无需复杂的配置。
- 强大的格式化:loguru 提供了丰富的日志消息格式化选项,使得日志信息更加清晰和易于理解。
- 异常处理:loguru 通过提供更加详细的异常跟踪信息,简化了错误定位和处理过程。
- 灵活的配置:loguru 允许开发者轻松定义多个日志处理器,以适应不同的日志记录需求。
- 性能:尽管 loguru 提供了更多的功能,但它在性能上仍然非常高效,适合用于生产环境。
1 使用¶
0 环境准备¶
安装
导入
1 基本用法¶
# 记录不同级别的日志信息
logger.debug("debug message.")
logger.info("info message.")
logger.warning("warning message.")
logger.error("error message.")
logger.critical("critical message.")
默认是彩色输出的, 非常地很直观啊.

2 写入到文件¶
其中:
orange_log.log: 是我们要记录的文件的名称
format: 是记录日志的格式
level: 是记录日志的最低水平
3 定量就生成新日志¶
达到 100MB 就生成一个新文件.
4 定时生成一个新日志¶
每天0点生成一个新文件.
每周生成一个新文件.
5 只保留n天的日志¶
有时候, 尤其在一些行业, 往往受到监管的一些要求, 比如日志需要保留半年, 因此我们需要可以设置日志保留的时间, 多余的日志自动清除:
6 压缩日志文件¶
将日志文件以压缩文件的格式保存, 以减少因日志占用太多空间.
7 多进程安全¶
loguru默认是线程安全的,但它不是多进程安全的。
但如果我们需要多进程/异步日志记录,它也支持的,需要添加一个 enqueue参数。
8 异常捕获¶
from loguru import logger
@logger.catch
def func(x, y):
return x / y
def main():
func(1, 0)
print('正常运行')
if __name__ == '__main__':
main()
通过@logger.catch可以捕获异常, 并在日志记录显示具体的异常的情况, 并显示变量的具体的值, 以便我们可以更好地跟踪和分析日志.

2 场景化使用¶
1 场景1¶
在测试环境下的标准输出中, 只显示DEBUG以上的输出;
在生产环境下的标准输出中, 只显示INFO以上的输出;
在日志文件中, 只显示ERROR以上的记录.
首先我们需要设置一个环境变量LOGURU_LEVEL, 这个变量的值有DEBUG, INFO等等, 如果不设置这个环境变量, 那个在代码中会默认设置为DEBUG, 所有当在生产环境中时, 我们直接设置一个环境变量LOGURU_LEVEL = INFO. 即可不显示DEBUG的日志内容(比如在bat脚本中设置).
import sys
from os import environ
from loguru import logger
logger.add('./logs/orange1.log', rotation='1 MB', level='ERROR')
logger.debug("debug message.")
logger.info("info message.")
logger.warning("warning message.")
logger.error("error message.")
logger.critical("critical message.")
2 场景2¶
写入到日志文件, 只保留INFO等级以上的记录;
日志只保留30天;
每天12点滚动生成一个新日志;
将日志文件压缩成tar格式;
from loguru import logger
logger.add('./logs/orange2.log', rotation='12:00', level='INFO', retention='30 days', compression="tar")
logger.debug("debug message.")
logger.info("info message.")
logger.warning("warning message.")
logger.error("error message.")
logger.critical("critical message.")
3 场景3¶
如果函数出现异常, 捕获它, 并发送通知到企业微信或发送邮件;
from loguru import logger
from traceback import format_exc
def send_msg():
...
def error_callback(errorText):
# 程序异常捕捉, 发送报错信息到指定邮箱
send_msg(errorText, format_exc())
@logger.catch(onerror=error_callback)
def main():
print(1/0)
其中, @logger.catch 可以作为装饰器对异常进行捕捉, onerror可以指定一个函数作为参数, 参数值是错误对象.
这里写一个使用yagmail的例子可以作为参考, 也是我有时候在用的, 当然了, logger也有自己的一套邮件通知方式, 这里除了发送邮件, 还可以使用很多其他的操作去处理异常:
from loguru import logger
from traceback import format_exc
from yagmail import SMTP
mailConfig = {
'user': {
'orange@orange.cn': '爬虫程序报错通知'
},
'password': 'msg',
'host': '192.168.1.1',
'port': 25,
'smtp_ssl': False
}
mailUsers = {
'orange@qq.com': 'orange',
}
def error_callback(errorText):
# 程序异常捕捉, 发送报错信息到指定邮箱
server = SMTP(**mailConfig)
content = f'{datetime.now():%Y-%m-%d %H:%M:%S} 程序运行报错: \n{errorText}\n{format_exc()}'
mailContent = {
'to': mailUsers,
'subject': '程序报错',
'contents': content
}
server.send(**mailContent)
server.close()
@logger.catch(onerror=error_callback)
def main():
print(1/0)
3 关于¶
总而言之,loguru 是一个强大且用户友好的日志记录工具,适用于多种不同的应用场景。它在易用性、功能和性能方面都对 Python 的标准 logging 模块进行了显著的改进, 我们也可以在更多项目中使用loguru。
最后, 欢迎关注我的微信公众号, 如果觉得这篇文章还不错的话, 希望给我点个赞 & 投个币。