一个考虑到灵活性和性能的日志框架。
快速入门
导入系统。记录器main|IO()main=withConsoleLogger信息$do日志信息“moin”带标签(“功能”,“f”)f日志警告“tschüss”哪里f=带电平调试$dologg调试“Debug f”
概述
测井系统由四个主要部分组成:
-
日志前端是使用的类型和函数在代码中生成日志消息。这包括日志级别
类型日志策略
类型日志标签
和LogScope(日志范围)
类型,这个日志函数
类型,以及MonadLog公司
类型类。
-
摘要记录器Tx
是上下文日志函数
将日志消息传递到记录器后端。
-
格式化程序是用于序列化日志消息的函数。
-
记录器后端是由调用的回调记录器
在每个日志消息。记录器后端应用格式化功能并将日志消息传递到某个接收器。
该框架允许您以模块化的方式组合这些组件。这个前端类型记录器
,后端回调由表示类型或类型类。格式化程序仅作为概念存在于back-ends的实现。这些类型和概念共同构成模块中定义的抽象记录器接口系统。记录器。类型
.
该包还提供了实现这些组件的具体Logger在模块中系统。记录器。记录器
和系统。记录器。后端。把手
.
记录器实现
在服务应用程序中写入日志消息应该只引入最小值写入日志消息的线程中的延迟开销。处理应该尽可能异步完成。该框架解决了这是通过在异步记录器后端执行所有序列化和IO实现的回调。
生成日志消息时,它与记录器上下文关联。这个记录器上下文包括
- 对数级阈值,
- 作用域,它是用于用附加信息标记日志消息,以及
- 指定如何处理以下情况的策略日志消息管道堵塞。
日志消息可以是任何Haskell类型显示
,可打字的
、和NFData公司
约束。理想情况下,在程序中计算记录值,以便构造和强制它不会引入任何额外的开销。
生成日志消息时,会用时间戳对其进行标记。这介绍了开销,还有优化的空间。日志消息还具有日志级别。如果日志消息时有效的日志阈值是写入未满足,未生成消息。
记录器具有内部日志消息队列。进一步的基准应该是在选择最适合此目的的队列实现中完成。
记录器从队列中异步读取日志消息并调用每条消息的后端回调。现在代码只包含一个后端,即用于写入句柄,但我们将添加更多很快就会退场。由于采用模块化设计,可以将不同的向后插入单个后端,以便消息由多个单个后端并交付给多个接收器。
后端包括格式化功能。这是除了IO之外进行处理。
将序列化延迟到处理管道的末尾以下优点:
- 序列化是异步完成的,
- 序列化仅针对实际传递的消息和它只针对与各自的后端,以及
- 很容易部署不同的序列化方法。
例如,当登录到控制台时,通常需要一行UNIX工具友好格式。对于云服务,可以选择高效的二进制序列化,后端将消息存储在远程数据库中。可能在某些情况下,所有或某些消息的数据只是在丢弃消息之前进行聚合以进行统计分析。这个将日志消息的生成和序列化解耦的模块化设计,只需使用不同的back-ends,可能由格式化函数参数化。