-
Notifications
You must be signed in to change notification settings - Fork 1
Интерполяция строк в логах #31
Description
Для логирования приходится собирать строки из множества кусочков, например Log.logInfo $ "User UID-" <> tshow userId <> " has run payment for $" <> paymentAmount <> ...". Проблемы:
- это трудночитаемо и громоздко из-за обилия
<>и show/tshow - вероятно, это еще и непроизводительно. Пишут, что show небыстрый, а мы еще конвертим полученную String в Text вместо того, чтобы сразу выводить в Text или в Text.Builder.
- show выводит сложные данные в формате, который плохо подходит для чтения. Известно, что класс
Showпытается делать слишком много и ничего не делает хорошо. Он плох и для сериализации в паре сRead, и для читабельности вывода, и для настраиваемого вывода чисел и всего такого. - нет способа задать форматирование такого-то типа данных для логирования. Приходится снова и снова писать длинные выражения вида
" UID-" <> tshow userId, тогда как хотелось бы определить инстанс какого-нибудь тайпкласса дляUserId, писать что-то типа<> userId <>и получать унифицированное форматирование всех айдишников юзеров.
Есть Text.Printf, но его невозможно расширить - из него не экспортируются нужные тайпклассы, к которым можно было бы прикрутить вывод, скажем, в Text. А еще printf интерпретирует форматную строку в рантайме, что не так эффективно, как могло бы быть, и может откладывать до рантайма ошибки, обнаружимые во время компиляции.
В идеале хотелось бы чего-то такого: Log.logInfo [s|{userId} has run payment for ${amount:.2}]. Где-то должна быть библиотека с синтаксисом [s|....], куда можно записывать текст и последовательности, содержащие Haskell-выражения, которые будут вычислены, преобразованы в текст и вставлены в строку. Возможно, ее придется расширить, чтобы можно было использовать дополнительный тайпкласс для форматирования данных только в логи и никуда больше, и чтобы вывод был в Text или Text.Builder.
Проблема касается не только логов, а работы со строками вообще. Просто с логами приходится работать чаще.