Haskell 我怎样才能和仆人一起使用原木整经机?

Haskell 我怎样才能和仆人一起使用原木整经机?,haskell,logging,servant,Haskell,Logging,Servant,我有一个构建在Servant之上的应用程序,现在我想向该应用程序添加日志记录。我浏览了Haskell日志包,我认为这一个提供了我需要的: 使用Servant构建应用程序时经常使用的“设计模式”之一是使用Reader monad,因此我对应用程序使用这种方法:我有AppEnv,其中包含AppConfig。通常,我可以在AppEnv中添加类似“logger”的实体,以便在处理程序中使用它。虽然LogWarper不提供“logger”,但它使用了不同的方法(我认为它似乎是另一个monad;请参见上面链

我有一个构建在Servant之上的应用程序,现在我想向该应用程序添加日志记录。我浏览了Haskell日志包,我认为这一个提供了我需要的:

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

这是我的基于仆人的应用程序(使用最新版本的仆人,基于文档中的示例:):

data AppEnv=AppEnv{config::config}
类型MyHandler=ReaderT AppEnv(ServantErr IO除外)
startApp::AppEnv->IO()
STARTAP env=do
运行16384(应用程序环境)
app::AppEnv->Application
app env=serve readerAPI(readerServer env)
readerAPI::代理readerAPI
readerAPI=Proxy
readerToHandler::AppEnv->Reader AppEnv a->Handler a
readerToHandler环境r=返回(runReader环境)
readerServer::AppEnv->Server ReaderAPI
readerServer env=提升服务器readerAPI(readerToHandler env)readerServerT
b::读卡器AppEnv Bool
b=do
c服务器配置
getServerConfig(配置s_uuz)=s
getServerPort::ServerConfig->Int
getServerPort(ServerConfig\up)=p
readerServerT::ServerT ReaderAPI(读卡器AppEnv)
readerServerT=a:b其中
a::读卡器AppEnv Int
a=返回1797
以下是主要功能:

main :: IO ()
main = do
  config <- loadYamlSettings ["etc/config.yaml"] [] useEnv
  print (config :: Config)
  let
    env = AppEnv config
  startApp env
main::IO()
main=do
配置常规日志记录
如果您想要一个带有一些复杂选项的通用测井工具,这看起来是一个不错的选择。甚至还有一个关于如何与仆人一起使用它的小问题。您只需将
katip
的几个参数添加到
Config
类型中,初始化它们,然后就可以登录处理程序了

请求日志记录
servant server
构建在
wai
warp
之上,因此您可以重用这些工具。如果您只是对记录请求到服务的数据感兴趣,那么您可以在不更改任何类型的情况下使用

startApp
看起来像这样

startApp::AppEnv->IO()
STARTAP env=do
WithStOutLogger$\logger->
运行设置(设置端口16384$setLogger$defaultSettings)$app env

你好!我是《黑客》最新版本的作者。我真的很喜欢你使用图书馆的事实!但该组织不再维持该版本。本教程适用于最新版本,但
master
分支包含对
log warper
的完整重写。我不知道这个图书馆的未来计划。我可以帮助您解决问题,但首先使用
log warper
可能不是一个好主意。@Shersh非常感谢您提供的详细信息!因此,如果该项目不再受到支持,您是否可以为haskell提供一些合适的日志库?(我的意思是,你似乎对这个话题很在行)我还没有写过像样的日志库;)除了笑话。在我们的工作中,我们在不同的项目中使用了
katip
monad logger
,我们仍在考虑哪一个更好。我想你可以选择
katip
monad logger
,哪一个你更喜欢。这些库之间的一个显著区别是:
monad logger
在单独的线程中运行日志记录。这可能会提高日志记录的性能,但有时也会导致奇怪的错误。顺便说一句,如果您仍然感兴趣,我已经完成了我正在编写的库。你甚至可以阅读这篇博文:请随意分享任何反馈和提出任何问题:)
main :: IO ()
main = do
  config <- loadYamlSettings ["etc/config.yaml"] [] useEnv
  print (config :: Config)
  let
    env = AppEnv config
  startApp env