04-日志记录框架及其特性
11.3 日志记录框架及其特性
主流语言提供各种各样的日志记录框架。值得留意的日志记录框架包括来自Java的Log4j、C#的Serilog和Node.js的Bunyan。从这些框架广受青睐,以及它们的应用场景来看,日志记录框架应该为用户提供的功能有相似之处。以下是日志记录框架应该具有的最理想特性。
- 快速 :日志记录框架必须确保它们在记录日志时不会执行开销昂贵的操作,并且应该尽可能少地使用CPU时钟周期进行高效处理。例如在Java中,如果你的日志语句中包含大量进行to_string()调用的对象,以便将其插入日志消息中,那么这是一项开销昂贵的操作。这被认为是Java中的低效实践。
- 可配置的输出 :仅将消息记录输出到标准输出是非常局限的。它仅会保留到Shell会话,你需要手动将日志复制/粘贴到文件以供后续使用。日志记录框架应该能够支持多个输出,例如文件,甚至是网络套接字。
- 日志分级 :使得日志记录框架从基于print语句的日志记录中脱颖而出的一个特性,它能够控制日志记录的内容和时间。
- 这通常通过日志分级的概念来实现。日志分级是一个可配置的过滤器,通常实现为在将日志输出发送到任何地方之前检查其类型。分级通常按照以下顺序排列,从最高优先级到最低优先级。
-
+ **错误** :此级别适用于记录关键事件,以及可能导致应用程序无效输出的事件。- 警告 :此级别适用于你已经执行评估的事件,以及希望知道何时发生时,如果它们频繁发生,则采取相应措施。
- 信息 :此级别可用于正常事件,例如输出应用程序版本、用户登录及连接成功等消息。
- 调试 :顾名思义,此级别用于处理调试。它可用于监视变量的值,以及在调试时在不同的代码路径中操作它们。
- 跟踪 :当你希望逐行执行算法或编写的某个特定函数时,将采用此级别。
带参数和返回值的方法调用是可以作为跟踪日志的。
其中的一些名称可能在框架之间略有不同,但它们所代表的优先级大致相同。在主流的日志记录框架中,这些级别由记录器在其初始化期间设置,在后续进行任何日志记录操作时都会检查设置的级别并进行相关的日志过滤。例如,Logger对象的Logger.set_level(INFO)调用将允许记录使用信息以上级别的所有日志,同时忽略调试和跟踪日志。
- 日志过滤 :它通常很容易只记录代码中的特定位置,并根据事件的严重性/重要性来关闭其他日志。
- 日志轮换 :当日志记录输出到文件时,很明显的长期的日志记录操作将会填满硬盘空间。日志记录框架应该提供限制日志文件大小的功能,并允许删除较旧的日志文件。
- 异步日志记录 :主线程上的日志记录调用可能会阻塞其他代码的运行。即使高效的记录器尽可能少地占用资源,它仍然会在实际代码之间阻塞I/O调用。因此,用户希望将大多数日志记录调用转移到专用的记录器线程。
- 日志消息属性 :值得一提的另一件事是发送到日志记录API的日志消息属性。日志框架至少应该提供一些属性来记录消息。
- 时间戳 :事件发生的时间。
- 日志级别 :消息的重要性级别,例如错误、警告、信息及调试等。
- 事件位置 :事件在源代码中发生的位置。
- 消息 :描述发生实际事件的消息。
根据这些特性,日志记录框架在处理日志记录方面存在一些差异。接下来让我们对它们进行探讨。