fullstack-development / haskell-starter-kit

Starter Kit for web-backend apps written with Haskell, Servant, Docker and PostgreSQL
BSD 3-Clause "New" or "Revised" License
1 stars 1 forks source link

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

Open antonkalinin-ml opened 3 years ago

antonkalinin-ml commented 3 years ago

Для логирования приходится собирать строки из множества кусочков, например Log.logInfo $ "User UID-" <> tshow userId <> " has run payment for $" <> paymentAmount <> ...". Проблемы:

Есть Text.Printf, но его невозможно расширить - из него не экспортируются нужные тайпклассы, к которым можно было бы прикрутить вывод, скажем, в Text. А еще printf интерпретирует форматную строку в рантайме, что не так эффективно, как могло бы быть, и может откладывать до рантайма ошибки, обнаружимые во время компиляции.

В идеале хотелось бы чего-то такого: Log.logInfo [s|{userId} has run payment for ${amount:.2}]. Где-то должна быть библиотека с синтаксисом [s|....], куда можно записывать текст и последовательности, содержащие Haskell-выражения, которые будут вычислены, преобразованы в текст и вставлены в строку. Возможно, ее придется расширить, чтобы можно было использовать дополнительный тайпкласс для форматирования данных только в логи и никуда больше, и чтобы вывод был в Text или Text.Builder.

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