2014-09-24 2 views
2

Я хотел бы записать количество времени, которое требуется передать в 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, но я не могу понять, где он пошел

+0

Я не знаю, да, но это в целом выглядит разумным. Но почему бы вам не отвлечь его на функцию, принимающую действие, и вернуть действие, которое дает как основной результат, так и время, которое оно потребовалось? – dfeuer

+0

@dfeuer спасибо! Нужно ли углублять обработчик? –

+1

Кажется маловероятным, что это лучший подход: http://hackage.haskell.org/package/wai-extra-3.0.2.1/docs/src/Network-Wai-Middleware-RequestLogger.html#detailedMiddleware 'может быть ближе к что требуется –

ответ

2

Я создал небольшой Вай Middleware вы можете использовать для запросов времени:

-- 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 и других посредников Вай. Надеюсь, я смогу лучше понять это сегодня вечером и вернуться и отредактировать этот ответ с подробностями, но я собираюсь опаздывать на работу.

+1

Выглядит блестяще @MaxGabriel. Спасибо –

Смежные вопросы