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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions