Haskell:
Журналирование
Как:
В Haskell логгирование может быть реализовано с помощью библиотек, таких как monad-logger
или hslogger
. Вот короткий пример с использованием monad-logger
:
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad.Logger
import Control.Monad.IO.Class (liftIO)
logExample :: LoggingT IO ()
logExample = do
logInfoN "Запуск приложения..."
liftIO $ putStrLn "Выполнение критически важной работы..."
logErrorN "Ой! Что-то пошло не так."
main :: IO ()
main = runStdoutLoggingT logExample
{- Пример вывода
[Info] Запуск приложения...
Выполнение критически важной работы...
[Error] Ой! Что-то пошло не так.
-}
Этот простой пример демонстрирует, как вы можете расставлять заявления о логгировании по всему своему коду, чтобы получить представление о том, что происходит во время выполнения. logInfoN
и logErrorN
используются для записи информационных и сообщений об ошибках соответственно.
Подробнее:
Логгирование прошло долгий путь от простых команд печати до сложных систем логгирования. Исторически логи были просто текстовыми выводами в консоль или файл, но теперь они включают структурированные данные, которые могут быть проанализированы различными инструментами.
В Haskell логгирование может быть выполнено в чисто функциональном стиле, который включает явную передачу действий логгирования или использование монадических контекстов для нечистот, где логгеры неявно протягиваются через вычисления.
Например, библиотека hslogger
более традиционная и изменяемая по сравнению с monad-logger
. monad-logger
предлагает интеграцию с монадическим стеком и обеспечивает большую гибкость в плане форматирования вывода и управления. Обе библиотеки позволяют устанавливать уровни логгирования, которые помогают фильтровать сообщения логов на основе их важности. Уровни логгирования включают debug, info, notice, warning, error, critical, alert и emergency.
Подход Haskell к логгированию часто согласуется с его акцентом на типовую безопасность и чистоту. Логи могут быть обработаны таким образом, что даже если логгирование потерпит неудачу, это не приведет к сбою основного приложения из-за надежных возможностей обработки ошибок Haskell.