Сложность составления сообщений журнала для RIO.Logger через UTF8Builder

Я использую монаду RIO и библиотеки 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?

1 ответ

Решение

Вы хотите Display пример для вашего UUID, что позволит сочетать с Utf8Builder эффективно и легко использовать его в своих журналах.

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

Единственная причина, почему displayBytesUtf8может быть использован, потому что вы знаете, что содержимое находится в ascii. Другими словами, это ваша ответственность при созданииDisplay экземпляр, что он создает правильно закодированные байты utf8.

После этого вы можете использовать его в своих журналах следующим образом:

logInfo $ "Identifier: " <> display myId

Создание Displayinstance, строго говоря, не требуется, вы можете просто использовать вспомогательную функцию, если не хотите создавать сиротские экземпляры или новые типы оболочки. Это подойдет:

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

Причина, по которой я упоминаю Display потому что это идиоматический подход в RIO для ведения журнала с пользовательскими типами.

Другие вопросы по тегам