on master help sign in
fast-logger/wai-logger 2.0
commit441a1d776c5e323d9529802a33aac09543da5d59 authorMichael Snoyman <michael@snoyman.com> dateMon 2 Dec 2013, 09:09 (13 years ago) parent622d8ee
4 files changed+38−42
wai-extra/Network/Wai/Middleware/RequestLogger.hs+28−22 wai-extra/Network/Wai/Middleware/RequestLogger/Internal.hs+2−11 wai-extra/test/WaiExtraTest.hs+6−6 wai-extra/wai-extra.cabal+2−3
wai-extra/Network/Wai/Middleware/RequestLogger.hs+28−22
@@ -24,14 +24,17 @@ import System.IO (Handle, stdout)
2424import qualified Data.ByteString as BS
2525import Data.ByteString.Char8 (pack, unpack)
2626import Control.Monad.IO.Class (liftIO)
27−import Network.Wai (Request(..), Middleware, responseStatus, Response)
27+import Network.Wai (Request(..), Middleware, responseStatus, Response, responseHeaders)
2828import System.Log.FastLogger
2929import Network.HTTP.Types as H
3030import Data.Maybe (fromMaybe)
3131import Control.Monad.Trans.Resource (withInternalState)
32+import Data.Monoid (mconcat)
33+import Blaze.ByteString.Builder (toByteString)
3234
3335import Network.Wai.Parse (sinkRequestBody, lbsBackEnd, fileName, Param, File, getRequestBodyType)
3436import qualified Data.ByteString.Lazy as LBS
37+import qualified Data.ByteString.Char8 as S8
3538
3639import qualified Data.Conduit as C
3740import qualified Data.Conduit.List as CL
@@ -41,20 +44,20 @@ import Data.IORef.Lifted
4144import System.IO.Unsafe
4245
4346import Data.Default (Default (def))
44−import Network.Wai.Logger.Format (apacheFormat, IPAddrSource (..))
47+import Network.Wai.Logger
4548import Network.Wai.Middleware.RequestLogger.Internal
4649
4750data OutputFormat = Apache IPAddrSource
4851 | Detailed Bool -- ^ use colors?
4952 | CustomOutputFormat OutputFormatter
5053
51−type OutputFormatter = ZonedDate -> Request -> Status -> Maybe Integer -> [LogStr]
54+type OutputFormatter = ZonedDate -> Request -> Status -> Maybe Integer -> LogStr
5255
5356data Destination = Handle Handle
54− | Logger Logger
57+ | Logger LoggerSet
5558 | Callback Callback
5659
57−type Callback = [LogStr] -> IO ()
60+type Callback = LogStr -> IO ()
5861
5962data RequestLoggerSettings = RequestLoggerSettings
6063 {
@@ -77,28 +80,31 @@ instance Default RequestLoggerSettings where
7780
7881mkRequestLogger :: RequestLoggerSettings -> IO Middleware
7982mkRequestLogger RequestLoggerSettings{..} = do
80− (callback, mgetdate) <-
83+ callback <-
8184 case destination of
82− Handle h -> fmap fromLogger $ mkLogger autoFlush h
83− Logger l -> return $ fromLogger l
84− Callback c -> return (c, Nothing)
85+ Handle h -> return $ BS.hPutStr h . toByteString . logStrBuilder
86+ Logger l -> return $ pushLogStr l
87+ Callback c -> return c
8588 case outputFormat of
8689 Apache ipsrc -> do
87− getdate <- dateHelper mgetdate
88− return $ apacheMiddleware callback ipsrc getdate
90+ getdate <- getDateGetter
91+ apache <- initLogger ipsrc (LogCallback callback (return ())) getdate
92+ return $ apacheMiddleware apache
8993 Detailed useColors -> detailedMiddleware callback useColors
9094 CustomOutputFormat formatter -> do
91− getdate <- dateHelper mgetdate
95+ getdate <- getDateGetter
9296 return $ customMiddleware callback getdate formatter
93− where
94− fromLogger l = (loggerPutStr l, Just $ loggerDate l)
95− dateHelper mgetdate = do
96− case mgetdate of
97− Just x -> return x
98− Nothing -> getDateGetter
9997
100−apacheMiddleware :: Callback -> IPAddrSource -> IO ZonedDate -> Middleware
101−apacheMiddleware cb ipsrc getdate = customMiddleware cb getdate $ apacheFormat ipsrc
98+apacheMiddleware :: ApacheLoggerActions -> Middleware
99+apacheMiddleware ala app req = do
100+ res <- app req
101+ let msize = lookup "content-length" (responseHeaders res) >>= readInt'
102+ readInt' bs =
103+ case S8.readInteger bs of
104+ Just (i, "") -> Just i
105+ _ -> Nothing
106+ apacheLogger ala req (responseStatus res) msize
107+ return res
102108
103109customMiddleware :: Callback -> IO ZonedDate -> OutputFormatter -> Middleware
104110customMiddleware cb getdate formatter app req = do
@@ -222,7 +228,7 @@ detailedMiddleware' cb getAddColor app req = do
222228 addColor <- getAddColor
223229
224230 -- log the request immediately.
225− liftIO $ cb $ map LB $ addColor (requestMethod req) ++
231+ liftIO $ cb $ mconcat $ map toLogStr $ addColor (requestMethod req) ++
226232 [ " "
227233 , rawPathInfo req
228234 , "\n"
@@ -238,7 +244,7 @@ detailedMiddleware' cb getAddColor app req = do
238244 -- log the status of the response
239245 -- this is color coordinated with the request logging
240246 -- also includes the request path to connect it to the request
241− liftIO $ cb $ map LB $ addColor "Status: " ++ [
247+ liftIO $ cb $ mconcat $ map toLogStr $ addColor "Status: " ++ [
242248 statusBS rsp
243249 , " "
244250 , msgBS rsp
wai-extra/Network/Wai/Middleware/RequestLogger/Internal.hs+2−11
@@ -5,16 +5,7 @@
55module Network.Wai.Middleware.RequestLogger.Internal where
66
77import Data.ByteString (ByteString)
8−import System.Log.FastLogger
9−#if MIN_VERSION_fast_logger(0,3,0)
10−import System.Date.Cache (ondemandDateCacher)
11−#else
12−import System.Log.FastLogger.Date (getDate, dateInit, ZonedDate)
13−#endif
8+import Network.Wai.Logger (clockDateCacher)
149
1510getDateGetter :: IO (IO ByteString)
16−#if MIN_VERSION_fast_logger(0, 3, 0)
17−getDateGetter = fmap fst $ ondemandDateCacher zonedDateCacheConf
18−#else
19−getDateGetter = fmap getDate dateInit
20−#endif
11+getDateGetter = fmap fst clockDateCacher
wai-extra/test/WaiExtraTest.hs+6−6
@@ -3,6 +3,8 @@ module WaiExtraTest (specs) where
33
44import Test.Hspec
55import Test.HUnit hiding (Test)
6+import Data.Monoid (mappend, mempty)
7+import Blaze.ByteString.Builder (toByteString)
68
79import Network.Wai
810import Network.Wai.Test
@@ -544,21 +546,19 @@ caseDebugRequestBody = do
544546 getOutput params' = T.pack $ "GET /location\nAccept: \nGET " ++ show params' ++ "\nStatus: 200 OK. /location\n"
545547
546548 debugApp output' req = do
547− iactual <- liftIO $ I.newIORef []
549+ iactual <- liftIO $ I.newIORef mempty
548550 middleware <- liftIO $ mkRequestLogger def
549− { destination = Callback $ \strs -> I.modifyIORef iactual $ (++ strs)
551+ { destination = Callback $ \strs -> I.modifyIORef iactual $ (`mappend` strs)
550552 , outputFormat = Detailed False
551553 }
552554 res <- middleware (\_req -> return $ responseLBS status200 [ ] "") req
553555 actual <- liftIO $ I.readIORef iactual
554− liftIO $ assertEqual "debug" output $ logsToBs actual
556+ liftIO $ assertEqual "debug" output $ logToBs actual
555557 return res
556558 where
557559 output = TE.encodeUtf8 $ T.toStrict output'
558− logsToBs = S.concat . map logToBs
559560
560− logToBs (LB bs) = bs
561− logToBs (LS s) = S8.pack s
561+ logToBs = toByteString . logStrBuilder
562562
563563 {-debugApp = debug $ \req -> do-}
564564 {-return $ responseLBS status200 [ ] ""-}
wai-extra/wai-extra.cabal+2−3
@@ -33,9 +33,8 @@ Library
3333 , text >= 0.7 && < 0.12
3434 , case-insensitive >= 0.2
3535 , data-default
36− , date-cache >= 0.3 && < 0.4
37− , fast-logger >= 0.2 && < 0.4
38− , wai-logger >= 0.2 && < 0.4
36+ , fast-logger >= 2.0 && < 2.1
37+ , wai-logger >= 2.0 && < 2.1
3938 , conduit >= 1.0 && < 1.1
4039 , zlib-conduit >= 0.5 && < 1.1
4140 , blaze-builder-conduit >= 0.5 && < 1.1