summaryrefslogtreecommitdiff
path: root/Application.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Application.hs')
-rw-r--r--Application.hs41
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