From c670c54ba41c679911d046a417da8ca2021eef2f Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Tue, 3 Dec 2013 11:55:39 +0200 Subject: [PATCH] fast-logger 2.0 --- yesod-core/Yesod/Core/Class/Yesod.hs | 36 +++++++++++++++++++++++++-- yesod-core/Yesod/Core/Dispatch.hs | 5 ++++ yesod-core/Yesod/Core/Internal/Run.hs | 2 ++ yesod-core/Yesod/Core/Types.hs | 10 ++++++-- 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/yesod-core/Yesod/Core/Class/Yesod.hs b/yesod-core/Yesod/Core/Class/Yesod.hs index ad55e23c..a64d6ebc 100644 --- a/yesod-core/Yesod/Core/Class/Yesod.hs +++ b/yesod-core/Yesod/Core/Class/Yesod.hs @@ -41,8 +41,9 @@ import Network.Wai.Parse (lbsBackEnd, tempFileBackEnd) import System.IO (stdout) #if MIN_VERSION_fast_logger(2, 0, 0) -import Network.Wai.Logger (ZonedDate) +import Network.Wai.Logger (ZonedDate, clockDateCacher) import System.Log.FastLogger +import qualified GHC.IO.FD #else import System.Log.FastLogger.Date (ZonedDate) import System.Log.FastLogger (LogStr (..), Logger, @@ -215,7 +216,14 @@ class RenderRoute site => Yesod site where -- -- Default: Sends to stdout and automatically flushes on each write. makeLogger :: site -> IO Logger +#if MIN_VERSION_fast_logger(2, 0, 0) + makeLogger _ = do + loggerSet <- newLoggerSet defaultBufSize GHC.IO.FD.stdout + (getter, _) <- clockDateCacher + return $! Logger loggerSet getter +#else makeLogger _ = mkLogger True stdout +#endif -- | Send a message to the @Logger@ provided by @getLogger@. -- @@ -529,6 +537,30 @@ asyncHelper render scripts jscript jsLoc = Nothing -> Nothing Just j -> Just $ jelper j +#if MIN_VERSION_fast_logger(2, 0, 0) +formatLogMessage :: IO ZonedDate + -> Loc + -> LogSource + -> LogLevel + -> LogStr -- ^ message + -> IO LogStr +formatLogMessage getdate loc src level msg = do + now <- getdate + return $ + toLogStr now `mappend` + " [" `mappend` + (case level of + LevelOther t -> toLogStr t + _ -> toLogStr $ drop 5 $ show level) `mappend` + (if T.null src + then mempty + else "#" `mappend` toLogStr src) `mappend` + "] " `mappend` + msg `mappend` + " @(" `mappend` + toLogStr (fileLocationToString loc) `mappend` + ")\n" +#else formatLogMessage :: IO ZonedDate -> Loc -> LogSource @@ -554,7 +586,7 @@ formatLogMessage getdate loc src level msg = do , LS $ fileLocationToString loc , LB ")\n" ] - +#endif -- | Customize the cookies used by the session backend. You may -- use this function on your definition of 'makeSessionBackend'. diff --git a/yesod-core/Yesod/Core/Dispatch.hs b/yesod-core/Yesod/Core/Dispatch.hs index 48b08acf..df822e2d 100644 --- a/yesod-core/Yesod/Core/Dispatch.hs +++ b/yesod-core/Yesod/Core/Dispatch.hs @@ -3,6 +3,7 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE CPP #-} module Yesod.Core.Dispatch ( -- * Quasi-quoted routing parseRoutes @@ -163,7 +164,11 @@ warp port site = toWaiApp site >>= Network.Wai.Handler.Warp.runSettings mkDefaultMiddlewares :: Logger -> IO W.Middleware mkDefaultMiddlewares logger = do logWare <- mkRequestLogger def +#if MIN_VERSION_fast_logger(2, 0, 0) + { destination = Network.Wai.Middleware.RequestLogger.Logger $ loggerSet logger +#else { destination = Logger logger +#endif , outputFormat = Apache FromSocket } return $ logWare diff --git a/yesod-core/Yesod/Core/Internal/Run.hs b/yesod-core/Yesod/Core/Internal/Run.hs index ba65b3b1..25f51f12 100644 --- a/yesod-core/Yesod/Core/Internal/Run.hs +++ b/yesod-core/Yesod/Core/Internal/Run.hs @@ -36,7 +36,9 @@ import Network.Wai import Network.Wai.Internal #endif import Prelude hiding (catch) +#if !MIN_VERSION_fast_logger(2, 0, 0) import System.Log.FastLogger (Logger) +#endif import System.Log.FastLogger (LogStr, toLogStr) import System.Random (newStdGen) import Yesod.Core.Content diff --git a/yesod-core/Yesod/Core/Types.hs b/yesod-core/Yesod/Core/Types.hs index 7bb3c501..fa20c621 100644 --- a/yesod-core/Yesod/Core/Types.hs +++ b/yesod-core/Yesod/Core/Types.hs @@ -48,7 +48,7 @@ import Network.Wai (FilePart, import qualified Network.Wai as W import qualified Network.Wai.Parse as NWP #if MIN_VERSION_fast_logger(2, 0, 0) -import System.Log.FastLogger (LogStr, LoggerSet, toLogStr) +import System.Log.FastLogger (LogStr, LoggerSet, toLogStr, pushLogStr) import Network.Wai.Logger (DateCacheGetter) #else import System.Log.FastLogger (LogStr, Logger, toLogStr) @@ -453,5 +453,11 @@ instance ParseRoute WaiSubsite where parseRoute (x, y) = Just $ WaiSubsiteRoute x y #if MIN_VERSION_fast_logger(2, 0, 0) -data Logger = Logger !LoggerSet !DateCacheGetter +data Logger = Logger + { loggerSet :: !LoggerSet + , loggerDate :: !DateCacheGetter + } + +loggerPutStr :: Logger -> LogStr -> IO () +loggerPutStr (Logger ls _) = pushLogStr ls #endif