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 环境准备
安装
pip install loguru
导入
from loguru import logger
1 基本用法
# 记录不同级别的日志信息
logger.debug("debug message.")
logger.info("info message.")
logger.warning("warning message.")
logger.error("error message.")
logger.critical("critical message.")
默认是彩色输出的, 非常地很直观啊.
2 写入到文件
id = logger.add('orange.log', format="{time} | {level} | {message}", level="INFO")
其中:
orange_log.log
: 是我们要记录的文件的名称
format
: 是记录日志的格式
level
: 是记录日志的最低水平
3 定量就生成新日志
达到 100MB 就生成一个新文件.
logger.add("orange.log", rotation="100 MB")
4 定时生成一个新日志
每天0点生成一个新文件.
logger.add("orange.log", rotation="00:00")
每周生成一个新文件.
logger.add("orange.log", rotation="1 week")
5 只保留n天的日志
有时候, 尤其在一些行业, 往往受到监管的一些要求, 比如日志需要保留半年, 因此我们需要可以设置日志保留的时间, 多余的日志自动清除:
logger.add("orange.log", retention="180 days")
6 压缩日志文件
将日志文件以压缩文件的格式保存, 以减少因日志占用太多空间.
logger.add("orange.log", compression="zip")
7 多进程安全
loguru
默认是线程安全的,但它不是多进程安全的。
但如果我们需要多进程/异步日志记录,它也支持的,需要添加一个 enqueue
参数。
logger.add("orange.log", enqueue=True)
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脚本中设置).
set LOGURU_LEVEL=INFO
python test_log.py
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
。
最后, 欢迎关注我的微信公众号, 如果觉得这篇文章还不错的话, 希望给我点个赞 & 投个币。
原文始发于微信公众号(其之):python 更高效的日志记录工具: loguru
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204883.html