Skip to content

Интерполяция строк в логах #31

@antonkalinin-ml

Description

@antonkalinin-ml

Для логирования приходится собирать строки из множества кусочков, например 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.

Проблема касается не только логов, а работы со строками вообще. Просто с логами приходится работать чаще.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions