📄 JSONLogger

Compatible from Swift 5.1 to 6. Compatible with macOS, iOS, visionOS, tvOS and watchOS. Compatible with Linux, Windows, WASI and Android.

一个简单的兼容 swift-log 的日志记录器,以 JSON 格式记录日志,每行一条记录。

使用方法 🤓

在创建任何 logger 之前,使用 JSONLogger 引导 LoggingSystem

LoggingSystem.bootstrap(JSONLogger.init, metadataProvider: nil/* or whatever you want */)

要流式传输 JSONSeq (RFC 7464),您可以使用便捷的初始化器

LoggingSystem.bootstrap(JSONLogger.initForJSONSeq, metadataProvider: nil/* or whatever you want */)

日志格式 📖

JSONLogger 生成的 JSON 具有以下字段

JSON 应该不包含任何换行符,但是 JSONEncoder 不提供任何实际保证。 特别是,您可以配置 encoder 以漂亮地打印 JSON...

配置 🛠️

输出 FileHandle

默认情况下,JSONLogger 将日志记录到 stdout。您可以在初始化时使用 fileHandle 参数将其配置为记录到任何文件描述符。

行前缀、后缀和分隔符

JSONLogger 允许您选择

消息间分隔符在 JSON 消息之后记录,但仅在新消息到达时记录,而不是在每个 JSON 消息之后记录的后缀。

例如,如果您记录两条消息,您将获得以下输出

prefix JSON1 suffix  separator  prefix JSON2 suffix

一个有趣的配置是将前缀设置为 [0x1e],后缀设置为 [0x0a],这将生成 JSONSeq 流。

另一个有趣的配置是将 JSON 间分隔符设置为 [0xff][0xfe](或两者),并将前缀和后缀设置为空数组。0xff0xfe 字节永远不应出现在有效的 UTF-8 字符串中,并且可以用于分隔 JSON 有效负载(JSON 需要 UTF-8 编码)。

我不确定 JSONSeq 为什么不这样做,但肯定有充分的理由(可能是因为生成的输出将不再是有效的 UTF-8)。

JSON Encoder

为了记录消息,JSONLogger 将为每条消息创建一个 LogLine 结构体,然后使用 JSONEncoder 对此结构体进行编码。

此 encoder 是可自定义的。

JSONLogger 生成的所有 JSON 消息都应该可以被与 encoder 配置匹配的 JSONDecoder 解码。

当 Encoder 失败时

当编码日志行出现问题时(例如,日期格式化程序失败),JSONLogger 将回退到手动编码日志消息。

手动编码的 JSON 与正常输出略有不同

{
   "JSONLogger.LogInfo": "Original metadata removed (see JSONLogger doc)",
   "JSONLogger.LogError": ERROR_MESSAGE
}

修改后的日志消息仍然应该可以被 JSONEncoder 解析为 LogLine

StringConvertible 的 JSON 编码器

元数据条目的值的类型可以是 StringArrayDictionaryany StringConvertible

StringArrayDictionary 类型可以直接在 JSON 消息中编码。

对于 string convertibles,如果存在 JSONEncoder/JSONDecoder 对,JSONLogger 将使用它们。encoder 将用于编码给定的对象,decoder 将用于将生成的 JSON 解码为通用的 JSON 对象,然后将其放入 LogLine 结构体中。

如果 encoder/decoder 对设置为 nil,则使用 string convertible 的字符串表示形式。