Сложность составления сообщений журнала для 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
Создание Display
instance, строго говоря, не требуется, вы можете просто использовать вспомогательную функцию, если не хотите создавать сиротские экземпляры или новые типы оболочки. Это подойдет:
displayUUID :: UUID.UUID -> Utf8Builder
displayUUID = displayBytesUtf8 . UUID.toASCIIBytes
Причина, по которой я упоминаю Display
потому что это идиоматический подход в RIO для ведения журнала с пользовательскими типами.