我有一个基于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的应用程序(基于文档http://haskell-servant.readthedocs.io/en/stable/tutorial/Server.html#welcome-hoistserver中的示例,使用Servant的最新版本)
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等)但可能还有其他功能)?
谢谢
答案 0 :(得分:0)
如果您想要带有一些复杂选项的通用日志记录工具,katip似乎是一个不错的选择。关于如何与仆人一起使用,甚至还有一个很小的discussion。您只需将katip
的几个参数添加到Config
类型,对其进行初始化,然后就可以登录处理程序了。
servant-server
建立在wai
和warp
的基础上,因此您可以重用许多现有工具。如果您只想记录有关对服务方的请求的数据,则可以使用wai-logger而不更改任何类型。
startApp
看起来像这样。
startApp :: AppEnv -> IO ()
startApp env = do
withStdoutLogger $ \logger ->
runSettings (setPort 16384 $ setLogger logger $ defaultSettings) $ app env