我想在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中曾经有一个“定时”功能,但我无法弄清楚它已经消失了
答案 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中间件中裁剪出来的东西。希望我今晚可以更好地了解它并回来编辑这个答案的详细信息,但我即将上班迟到。