Как определить простой 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 })
а затем создайте значение
Env
type перед передачей в, вместо передачи всего выполнения приложения в качестве параметра функции в
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
.