python 更高效的日志记录工具: loguru

python 更高效的日志记录工具: loguru

0 背景


python 更高效的日志记录工具: loguru

日志记录是软件开发中的关键部分,它帮助开发者监控应用程序的运行状态,并在出现问题时进行故障排查。Python 的标准库中包含了一个名为 logging 的模块,它提供了一系列用于记录日志的工具。然而,logging 的配置过程可能既复杂又繁琐,每次写logging规则的时候我基本都会忘记, 因为很多时候涉及到日志的落盘 & 定时归档等一些其他的复杂的操作, 配置起来是真吊麻烦, 主要是经常忘。此外,logging 在默认设置下的一些行为可能不符合所有项目的需求。

loguru 是一个 Python 日志库,它提供了一种简单而友好的方法来处理日志记录。相比logging, 就是简单, 简单到一行配置的代码就能符合我的需求。loguru 以其易用性和功能丰富性著称,它通过简单的 API,让日志记录变得直观和无痛。

当然, loguru 非常适合于各种规模和复杂度的 Python 项目,无论是小型脚本还是大型应用程序, 在多线程中它也是线程安全的, 我们也无需担心在使用 loguru 进行日志记录时的线程安全问题。以下是一些常用的的应用场景:

  1. 调试和开发:在开发过程中,loguru 可以帮助追踪程序的执行流程和变量状态,从而简化调试过程。
  2. 错误跟踪:在生产环境中,loguru 可以记录异常和错误信息,帮助我们快速定位并解决问题, 这一点我觉得是非常好用的, 在日志中, 我们可以直观的看到报错的过程, 错误的变量是什么值, 都可以在日志中显示出来。
  3. 性能监控:通过记录关键操作的时间和结果,loguru 有助于分析和优化应用程序的性能。
  4. 用户行为分析:loguru 可用于记录用户在应用中的行为,从而帮助理解用户需求并改进产品。

那相比于logging, 也是有很明显的优势的:

  1. 易用性:loguru 的 API 更为简洁直观。它允许我们通过少量代码就可以实现日志记录,而无需复杂的配置。
  2. 强大的格式化:loguru 提供了丰富的日志消息格式化选项,使得日志信息更加清晰和易于理解。
  3. 异常处理:loguru 通过提供更加详细的异常跟踪信息,简化了错误定位和处理过程。
  4. 灵活的配置:loguru 允许开发者轻松定义多个日志处理器,以适应不同的日志记录需求。
  5. 性能:尽管 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.")

默认是彩色输出的, 非常地很直观啊.

python 更高效的日志记录工具: loguru

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(10)
    print('正常运行')

if __name__ == '__main__':
    main()

通过@logger.catch可以捕获异常, 并在日志记录显示具体的异常的情况, 并显示变量的具体的值, 以便我们可以更好地跟踪和分析日志.

python 更高效的日志记录工具: loguru

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!