【问题标题】:How can I use log-warper with Servant?如何将 log-warper 与 Servant 一起使用?
【发布时间】:2018-12-17 00:14:11
【问题描述】:

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

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

这是我基于 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 等)(特别是在处理程序中,但也可能在其他功能中)?

谢谢

【问题讨论】:

  • 您好!我是 Hackage 上最新的log-warper 版本的作者。我真的很喜欢你使用图书馆的事实!但该版本不再由该组织维护。教程适用于最新版本,但master 分支包含对log-warper 的完全重写。而且我不知道这个图书馆的未来计划。我可以帮助您解决问题,但首先使用 log-warper 可能不是一个好主意。
  • @Shersh 非常感谢您提供的详细信息!因此,如果不再支持该项目,您是否可以为haskell 推荐一些不错的日志库? (我的意思是,你似乎很擅长这个话题)
  • 我还没有写出像样的日志库 ;) 但是开玩笑。在我们的工作中,我们在不同的项目中使用katipmonad-logger,我们仍在思考哪个更好。我想你可以选择katipmonad-logger,你更喜欢哪一个。这些库之间的一个显着区别:monad-logger 在单独的线程中运行日志记录。这可能会提高日志记录的性能,但有时也会导致奇怪的错误。
  • 顺便说一句,如果你仍然感兴趣,我已经完成了我正在研究的库。您甚至可以阅读博文:kowainik.github.io/posts/2018-09-25-co-log 请随时分享任何反馈并提出任何问题 :)

标签: haskell logging servant


【解决方案1】:

一般日志记录

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

请求记录

servant-server 建立在waiwarp 之上,因此您可以重复使用很多工具。如果您只是对记录有关对servant 的请求的数据感兴趣,则可以使用wai-logger 而无需更改任何类型。

startApp 看起来像这样。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2015-10-28
    相关资源
    最近更新 更多