Как определить простой RIO LogFunc без выполнения брекетинга

Пытаюсь настроить логирование в приложении RIO; Тем не менее, я, кажется, не понимаю интерфейс регистрации.

В документации RIO рекомендуется определить регистратор и запустить приложение следующим образом:

      withLogFunc logOptions $ \lf -> do
  let env = Env -- application specific environment
        { appLogFunc = lf
        , appOtherStuff = ...
        }
  runRIO env $ do
    logInfo "Starting app"
    myApp ...

То есть выполнение самого приложения в скобках - зачем?

Я хочу перенести мою монаду RIO в Servant, чтобы этот подход с брекетингом мешал. Я бы хотел определить среду для использования с RIO, например:

      data Env = Env
  { config :: ...
  , logger :: !LogFunc
  }

сделать среду экземпляром HasLogFunc класс типов:

      instance HasLogFunc Env where
  logFuncL = lens logger (\x y -> x { logger = y })

а затем создайте значение Envtype перед передачей в, вместо передачи всего выполнения приложения в качестве параметра функции в withLogFunc. То есть я хотел бы что-то вроде

      let env = Env {
   config = ...
   logger = mkLogFunc ...
}
in runRIO env $ do 
   logInfo "Starting app"
   ...

Однако я не понимаю, как создать LogFuncкак часть среды отдельно. Таким образом я мог поднять runRIO на сервер слуг ( server :: S.ServerT UserApi (RIO Env)), а затем выполните последнее. Похоже, что интерфейс регистрации RIO препятствует этому. Почему? Что мне не хватает?

Спасибо за любые идеи!

2 ответа

Решение

Создание (кроме тривиальных, которые отбрасывают все сообщения) потребуют выполнения эффектов для начальной настройки. Такие эффекты, как открытие файла журнала или выделение другого ресурса. Это в дополнение к эффектам регистрации каждого конкретного сообщения.

Вот почему -создание функций будет иметь форму скобок, например делает, или же возвращает функцию журнала внутри монады, например newLogFunc делает.

Я думаю, решение - просто потянуть withLogFuncнаружу, так что он также включает точку в коде, в которой вы создаете сервер Servant. Таким образом, у вас будет LogFunc под рукой, когда вам это нужно, и вы сможете построить среду и «поднять» runRIO.

Я думаю, что newLogFunc - это то, что вам нужно.

Другие вопросы по тегам