diff options
Diffstat (limited to 'Application.hs')
-rw-r--r-- | Application.hs | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/Application.hs b/Application.hs index b0fb61e..266475b 100644 --- a/Application.hs +++ b/Application.hs @@ -12,12 +12,18 @@ import Yesod.Default.Config import Yesod.Default.Main import Yesod.Default.Handlers import Network.Wai.Middleware.RequestLogger + ( mkRequestLogger, outputFormat, OutputFormat (..), IPAddrSource (..), destination + ) +import qualified Network.Wai.Middleware.RequestLogger as RequestLogger import qualified Database.Persist import Database.Persist.Sql (runMigration) -import Network.HTTP.Conduit (newManager, def) +import Network.HTTP.Conduit (newManager, conduitManagerSettings) import Control.Monad.Logger (runLoggingT) -import System.IO (stdout) -import System.Log.FastLogger (mkLogger) +import Control.Concurrent (forkIO, threadDelay) +import System.Log.FastLogger (newStdoutLoggerSet, defaultBufSize) +import Network.Wai.Logger (clockDateCacher) +import Data.Default (def) +import Yesod.Core.Types (loggerSet, Logger (Logger)) -- Import all relevant handler modules here. -- Don't forget to add new modules to your cabal file! @@ -36,7 +42,7 @@ mkYesodDispatch "App" resourcesApp -- performs initialization and creates a WAI application. This is also the -- place to put your migrate statements to have automatic database -- migrations handled by Yesod. -makeApplication :: AppConfig DefaultEnv Extra -> IO Application +makeApplication :: AppConfig DefaultEnv Extra -> IO (Application, LogFunc) makeApplication conf = do foundation <- makeFoundation conf @@ -46,25 +52,40 @@ makeApplication conf = do if development then Detailed True else Apache FromSocket - , destination = Logger $ appLogger foundation + , destination = RequestLogger.Logger $ loggerSet $ appLogger foundation } -- Create the WAI application and apply middlewares app <- toWaiAppPlain foundation - return $ logWare app + let logFunc = messageLoggerSource foundation (appLogger foundation) + return (logWare app, logFunc) -- | Loads up any necessary settings, creates your foundation datatype, and -- performs some initialization. makeFoundation :: AppConfig DefaultEnv Extra -> IO App makeFoundation conf = do - manager <- newManager def + manager <- newManager conduitManagerSettings s <- staticSite dbconf <- withYamlEnvironment "config/sqlite.yml" (appEnv conf) Database.Persist.loadConfig >>= Database.Persist.applyEnv p <- Database.Persist.createPoolConfig (dbconf :: Settings.PersistConf) - logger <- mkLogger True stdout - let foundation = App conf s p manager dbconf logger + + loggerSet' <- newStdoutLoggerSet defaultBufSize + (getter, updater) <- clockDateCacher + + -- If the Yesod logger (as opposed to the request logger middleware) is + -- used less than once a second on average, you may prefer to omit this + -- thread and use "(updater >> getter)" in place of "getter" below. That + -- would update the cache every time it is used, instead of every second. + let updateLoop = do + threadDelay 1000000 + updater + updateLoop + _ <- forkIO updateLoop + + let logger = Yesod.Core.Types.Logger loggerSet' getter + foundation = App conf s p manager dbconf logger -- Perform database migration using our application's logging settings. runLoggingT @@ -76,7 +97,7 @@ makeFoundation conf = do -- for yesod devel getApplicationDev :: IO (Int, Application) getApplicationDev = - defaultDevelApp loader makeApplication + defaultDevelApp loader (fmap fst . makeApplication) where loader = Yesod.Default.Config.loadConfig (configSettings Development) { csParseExtra = parseExtra |