如何在Servant中使用log-warper?

fyc*_*cth 5 logging haskell servant

我有一个基于Servant之上的应用程序,现在我想向该应用程序添加日志记录。我浏览了Haskell日志包,并假设此包提供了我所需要的:https : //github.com/serokell/log-warper/blob/master/log-warper/examples/HowTo.md

通常使用Servant构建应用程序的“设计模式”之一是使用Reader monad,因此我对应用程序使用这种方法:我有包含AppConfig的AppEnv。通常,我可以在AppEnv中添加类似“ logger”实体的内容,并在处理程序中使用它。尽管log-warper不提供“记录器”,但它使用了不同的方法(我认为这似乎是另一个monad;请参见上面链接中的示例)。因此,我不知道如何在Servant中使用此记录器。

这是我基于Servant的应用程序(基于文档中的示例使用了Servant的最新版本:http : //haskell-servant.readthedocs.io/en/stable/tutorial/Server.html#welcome-hoistserver):

data AppEnv = AppEnv { config :: Config }
type MyHandler = ReaderT AppEnv (ExceptT ServantErr IO)

startApp :: AppEnv -> IO ()
startApp env = do
  run 16384 (app env)

app :: AppEnv -> Application
app env = serve readerAPI (readerServer env)

readerAPI :: Proxy ReaderAPI
readerAPI = Proxy

readerToHandler :: AppEnv -> Reader AppEnv a -> Handler a
readerToHandler env r = return (runReader r env)

readerServer :: AppEnv -> Server ReaderAPI
readerServer env = hoistServer readerAPI (readerToHandler env) readerServerT

b :: Reader AppEnv Bool
b = do
  c <- config <$> ask
  let
    s = getServerConfig c
    p = getServerPort s
  return (p == 1)

getServerConfig :: Config -> ServerConfig
getServerConfig (Config s _) = s

getServerPort :: ServerConfig -> Int
getServerPort (ServerConfig _ p) = p

readerServerT :: ServerT ReaderAPI (Reader AppEnv)
readerServerT = a :<|> b where
    a :: Reader AppEnv Int
    a = return 1797
Run Code Online (Sandbox Code Playgroud)

这是主要功能:

main :: IO ()
main = do
  config <- loadYamlSettings ["etc/config.yaml"] [] useEnv
  print (config :: Config)
  let
    env = AppEnv config
  startApp env
Run Code Online (Sandbox Code Playgroud)

现在,我该如何向应用程序添加日志扭曲器,以便可以初始化记录器(假设使用launchFromFile),然后在应用程序中使用日志记录(logInfo,logError等)(特别是在处理程序中,但可能在其他功能)?

谢谢