在Yesod中记录响应时间

时间:2014-09-24 15:08:29

标签: haskell logging yesod

我想在Yesod中记录请求所需的时间。

我想我可以用以下内容做到这一点:

yesodMiddleware handler = do
          t1 <- liftIO $ getCurrentTime
          addHeader "Vary" "Accept, Accept-Language"
          authorizationCheck
          h <- handler --may need to seq this?
          t2 <- liftIO $ getCurrentTime
          -- unsure about this part
          $(logInfo) "Some string that includes t2-t1"
          h

我错过了什么吗?还有更好的方法吗?

在Yesod.Logger中曾经有一个“定时”功能,但我无法弄清楚它已经消失了

1 个答案:

答案 0 :(得分:2)

我创建了一个小型Wai中间件,可以用来计时请求:

-- Network/Wai/Middleware/RequestTimer.hs

module Network.Wai.Middleware.RequestTimer (
    requestTimer,
    ) where

import Prelude
import Network.Wai
import Data.Time (getCurrentTime, diffUTCTime)

requestTimer :: Middleware
requestTimer app req sendResponse = do
    t0 <- getCurrentTime
    app req $ \rsp -> do
        t1 <- getCurrentTime
        putStrLn $ "The request time is " ++ (show $ diffUTCTime t1 t0)
        sendResponse rsp

然后我将此模块添加到exposed-modules文件

中的.cabal
library
    exposed-modules: Application
                     Foundation
                     Import
                     -- lots more here
                     Network.Wai.Middleware.RequestTimer

然后在Application.hs我应用中间件:

import Network.Wai.Middleware.RequestTimer

makeApplication :: AppConfig DefaultEnv Extra -> IO Application
makeApplication conf = do
    foundation <- makeFoundation conf

    -- Create the WAI application and apply middlewares
    app <- toWaiAppPlain foundation
    return $ requestTimer app -- Note that you can chain multiple middlewares together here.

现在提出要求时,您会看到

The request time is 3.014697s

在控制台中打印。

我想更多地解释中间件但我真的不知道它是如何工作的 - 我只是从RequestLogger和其他Wai中间件中裁剪出来的东西。希望我今晚可以更好地了解它并回来编辑这个答案的详细信息,但我即将上班迟到。