盘点Python知名日志库:谁是你的最佳选择?

如果用 python 写一些简单或者临时用的小工具,代码只是几个函数,一个 py文件 的话,

那么,你不用考虑日志库,想显示什么信息,直接用 print 就可以了。

不过,对于稍微具规模的程序(特别是多线程的服务端程序),特别是 GUI 的程序,

如果没有日志的话,不仅开发的过程中难以调试,实际部署之后也无法在客户使用出现问题时及时对应。

Python 标准库中虽然有 logging 模块,但是功能相对简陋。

本篇介绍几个 python 中比较知名日志库,需要给自己的代码添加日志时,可以参考。

1. 日志的主要功能

日志不是软件功能的必需品,但是对于软件开发和维护具有至关重要的作用,其主要的作用在于:

  1. 问题追踪和调试:当程序出现错误或异常行为时,日志可以提供关于何时以及在哪里发生问题的详细信息,对于识别、隔离和修复错误很有帮助。
  2. 审计和合规性:提供详细的操作记录,用于证明系统是否符合规定。
  3. 系统监控和预警:通过分析日志,了解系统的运行状态,如服务的使用情况、性能瓶颈等;当检测到异常模式或潜在问题时,日志可以用于触发警报。
  4. 业务分析:记录了系统的所有活动,可以用于分析用户行为、业务趋势等。
  5. 安全性:在安全事件发生后,日志可以提供关于攻击者如何进入系统、他们做了什么等信息,对于进行事后分析和改进系统安全性非常重要。
  6. 故障恢复:如果系统出现故障,日志可以帮助理解故障发生前的系统状态,从而有助于数据恢复。

良好的日志实践可以提高软件的可靠性、可维护性和安全性。

不过,需要注意的是,过度日志记录可能会对系统性能产生影响,因此还需要合理平衡日志的详细程度和系统性能。

2. loguru:让日志变得简单

loguru 是一个旨在通过简单而直观的 API,使日志记录变得简单和愉快。

安装方式:

$ pip install loguru

loguru 开箱即用,和使用标准库一样方便

1.gif

loguru 的一些主要特点包括:

  1. 简单易用:只需导入 loguru 并调用相应的函数即可,无需复杂的配置。
  2. 自动格式化:自动为日志消息添加时间戳、日志级别等信息,减少编写日志记录代码的工作量,并使日志更加易于阅读和分析。
  3. 强大的日志级别控制:根据需要输出不同级别的日志,更好地控制日志的详细程度,可轻松调整日志级别。
  4. 输出目标灵活性:日志消息可输出到多个目标,如控制台、文件、网络等。
  5. 异常追踪:自动捕获和记录异常信息,并将其与日志消息一起输出,帮助用户快速定位和解决问题。
  6. 彩色输出支持:在控制台输出中添加颜色,使日志更易于阅读和区分。
  7. 上下文管理:可自定义上下文信息添加到日志消息中,有助于更好地理解和分析日志,特别是在处理复杂系统和多线程环境时。

3. structlog:结构化日志

structlog 的设计目标是为结构化日志输出提供简洁而强大的接口。

结构化日志输出 与传统的文本日志相比,可以提供更丰富、更易于解析和处理的信息。

安装方式:

$ pip install structlog

console_renderer.png

structlog 的一些主要特点包括:

  1. 结构化日志记录:可使用 Python 字典来记录日志,方便添加各种类型的数据(如字符串、数字、异常对象等)到日志中,并使这些数据在后续处理时仍然保持其原始结构和类型。
  2. 灵活的配置:根据需要选择不同的日志输出格式、处理器和渲染器。例如,用户可以将日志输出到控制台、文件、网络等不同的目标,也可以使用JSON、CSV等常用格式来输出日志。
  3. 与标准库兼容:与 Python 的标准库 logging 兼容,用户可以轻松地将现有的 logging 代码迁移到 structlog,或者同时使用这两个库。
  4. 性能优化:在性能上进行了优化,尽量减少日志记录对程序性能的影响。
  5. 扩展性强:具有良好的扩展性,方便地添加自定义的处理器和渲染器,以实现特定的日志处理需求。
  6. 易于使用API 设计得简洁明了,使得用户可以快速上手并有效地使用它。

4. logbook:一个很酷的日志库

logbook 的设计初衷是用来取代 Python 的标准库日志模块 logging

安装方式:

$ pip install Logbook

与标准库中的日志库相比, logbook 有以下一些优点:

  1. 更简洁的API:相较于 logging 模块的复杂API, logbook 提供了更简洁、易用的API。
  2. 更好的默认设置logbook 的默认设置比 logging 更合理。
  3. 上下文感知记录logbook 可以方便地记录上下文信息,如请求ID、用户ID等。而标准库 logging 模块则需要额外配置才能实现类似功能。
  4. 灵活的日志处理器logbook 支持多种日志处理器,可以轻松地将日志发送到文件、控制台、邮件、数据库等。
  5. 性能优化logbook 在性能上经过优化,相较于 logging 模块,其对应用程序的性能影响较小。
  6. 集成异常追踪logbook 会自动集成异常的堆栈追踪信息,无需手动添加。而 logging 模块则需要通过配置来实现此功能。
  7. 线程和进程安全logbook 是线程和进程安全的,可以在多线程或多进程环境中安全地使用,而 logging 模块在多线程环境下可能需要额外的同步措施。
  8. 易于扩展和定制logbook 的设计使得它易于扩展和定制。

5. python-json-logger:json格式日志

顾名思义, python-json-logger 是一个用于记录 JSON 格式日志的库。

使用 JSON 格式,是为了让日志更容易被各种编程语言读取。

安装方式:

$ pip install python-json-logger

python-json-logger 的主要特点包括:

  1. JSON格式日志记录:将日志记录为JSON格式,易于解析和存储。同时,也方便与其他系统和服务进行集成。
  2. 可配置的日志格式:根据需要配置日志格式,包含各种字段和信息,如时间戳、日志级别、线程名称等。
  3. 多个日志处理器支持:可以将日志输出到不同的目标,如文件、控制台、远程服务器等。
  4. 异步日志记录:支持异步日志记录,意味着可以在后台线程中处理日志记录任务,避免阻塞主线程的执行。
  5. 上下文信息添加:可以在日志记录时添加额外的上下文信息,如用户ID、请求ID等。
  6. 灵活的过滤和级别控制:灵活的过滤和级别控制机制。根据需要设置不同的日志级别,并定义过滤器来筛选需要记录的日志消息。
  7. 与标准库兼容:与 Python 标准库的 logging 模块兼容。

6. 结论

以上 4个 日志库是目前 github 上最受欢迎的 python 日志库,其中 logurustar数 远远高于其他3个。

不过,选择哪个库,它的 star数 并不是唯一的标准,是否符合我们的应用场景更加重要。

对于 loguru 来说,它适用于需要简单、轻量级和易于使用的日志功能的场景。

若你的项目是小型到中型的规模,日志需求比较简单,且开发者也不想花费过多时间在日志配置上,

那么, loguru 是一个很好的选择,它提供了合理的默认配置。

对于 structlog 来说,它适用于需要高度结构化日志的场景。

如果你的项目是大型、分布式系统或微服务的架构,其中日志需要在多个组件和服务之间进行传递和处理,

那么, structlog 是一个很好的选择。

对于 logbook 来说,它适用于需要高度灵活和可配置日志功能的场景。

如果你的项目是中型到大型的规模,其中需要对日志进行更精细的控制和管理,

或者对于需要替换标准库 logging 并寻求更多功能和改进性能的项目来说,

logbook 是一个很好的选择。

对于 python-json-logger 来说,它适用于需要以 JSON 格式记录日志的场景。

如果你的项目需要将日志与其他系统或服务进行集成(特别是那些使用 JSON 作为数据交换格式),

或者说随时需要对日志进行分析、监控或审计时, python-json-logger 是一个很好的选择。

原文地址:https://juejin.cn/post/7311643378575228938