难以通过 UTF8Builder 为 RIO.Logger 编写日志消息

Difficulty composing log messages for the RIO.Logger via UTF8Builder

我正在使用 RIO monad 和 RIO 库并想添加日志记录。 RIO 日志函数,如 logInfo,采用 Utf8Builder 作为参数,它是 ByteString 构建器的包装器。我想在我的代码中有效地插入日志语句。但是,我不确定如何将简单的 TextStringByteString 值转换为适当的 Builder。

这不进行类型检查:

logInfo $ "Identifier: " <> UUID.toByteString myId

其中 myId 是一个 UUID 值。类型检查器错误是

    • Couldn't match expected type ‘Utf8Builder’
                  with actual type ‘bytestring-0.10.10.0:Data.ByteString.Lazy.Internal.ByteString’

我尝试将 UUID 转换为 Text,尝试使用 encodeUtf8Builder,然后将生成的 Builder 包装在 Utf8Builder 中,但无济于事。

我的直觉告诉我,日志记录应该很简单,不需要大量转换;所以我可能错过了明显的路线。如何使用 RIO 记录器简单地记录值?

您想要的是 UUIDDisplay 实例,它将允许您与 Utf8Builder 有效结合并轻松地在您的日志中使用它。

instance Display UUID.UUID where
  display = displayBytesUtf8 . UUID.toASCIIBytes

唯一可以使用displayBytesUtf8的原因是因为你知道内容是ascii。换句话说,您有责任在创建 Display 实例时生成正确编码的 utf8 字节。

之后,您可以像这样在日志中使用它:

logInfo $ "Identifier: " <> display myId

创建 Display 实例严格来说不是必需的,如果您不想创建孤立实例或包装器新类型,则可以只使用辅助函数。这样就可以了:

displayUUID :: UUID.UUID -> Utf8Builder
displayUUID = displayBytesUtf8 . UUID.toASCIIBytes

我之所以提到 Display 是因为它是 RIO 中使用自定义类型进行日志记录的惯用方法。