gpt4 book ai didi

haskell - 如何将 log-warper 与 Servant 一起使用?

转载 作者:行者123 更新时间:2023-12-02 02:47:19 24 4
gpt4 key购买 nike

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

经常用于使用 Servant 构建应用程序的“设计模式”之一是使用 Reader monad,因此我对应用程序使用这种方法:我有包含 AppConfig 的 AppEnv。通常,我可以向 AppEnv 添加类似“记录器”实体的内容,以便在处理程序中使用它。虽然,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

这是主要功能:
main :: IO ()
main = do
config <- loadYamlSettings ["etc/config.yaml"] [] useEnv
print (config :: Config)
let
env = AppEnv config
startApp env

现在,我如何将 log-warper 添加到应用程序中,以便我可以初始化记录器(我假设使用 launchFromFile),然后在应用程序中使用日志记录(logInfo、logError 等)(特别是在处理程序中,但可能在还有其他功能)?

谢谢

最佳答案

一般日志记录

如果你想要一个带有一些复杂选项的通用日志工具 katip看起来是个不错的选择。甚至还有一个小discussion关于如何与仆人一起使用它。你只需要为 katip 添加几个参数给您的 Config键入,初始化它们,然后您就可以登录您的处理程序。

请求日志记录
servant-server建立在 wai 之上和 warp所以你可以重用很多那里的工具。如果您只想记录有关对servant 的请求的数据,可以使用wai-logger无需更改您的任何类型。
startApp看起来像这样。

startApp :: AppEnv -> IO ()
startApp env = do
withStdoutLogger $ \logger ->
runSettings (setPort 16384 $ setLogger logger $ defaultSettings) $ app env

关于haskell - 如何将 log-warper 与 Servant 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51243381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com