难以通过 UTF8Builder 为 RIO.Logger 编写日志消息
Difficulty composing log messages for the RIO.Logger via UTF8Builder
我正在使用 RIO monad 和 RIO 库并想添加日志记录。 RIO 日志函数,如 logInfo
,采用 Utf8Builder
作为参数,它是 ByteString
构建器的包装器。我想在我的代码中有效地插入日志语句。但是,我不确定如何将简单的 Text
、String
和 ByteString
值转换为适当的 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 记录器简单地记录值?
您想要的是 UUID
的 Display
实例,它将允许您与 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 中使用自定义类型进行日志记录的惯用方法。
我正在使用 RIO monad 和 RIO 库并想添加日志记录。 RIO 日志函数,如 logInfo
,采用 Utf8Builder
作为参数,它是 ByteString
构建器的包装器。我想在我的代码中有效地插入日志语句。但是,我不确定如何将简单的 Text
、String
和 ByteString
值转换为适当的 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 记录器简单地记录值?
您想要的是 UUID
的 Display
实例,它将允许您与 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 中使用自定义类型进行日志记录的惯用方法。