【问题标题】:Difficulty composing log messages for the RIO.Logger via UTF8Builder难以通过 UTF8Builder 为 RIO.Logger 编写日志消息
【发布时间】:2020-05-19 23:01:15
【问题描述】:

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

这不会进行类型检查:

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

其中myIdUUID 值。类型检查器错误是

    • 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 记录器简单地记录值?

【问题讨论】:

标签: haskell logging rio


【解决方案1】:

您想要的是为您的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 中使用自定义类型进行日志记录的惯用方法。

【讨论】:

  • 感谢您的洞察力!不幸的是,文档中关于这个细节的信息非常少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多