1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
{-# LANGUAGE OverloadedStrings #-}
-- | Logging system for WAI applications.
--
-- High level sample code:
--
-- > {-# LANGUAGE OverloadedStrings #-}
-- > module Main where
-- >
-- > import Blaze.ByteString.Builder (fromByteString)
-- > import Control.Monad.IO.Class (liftIO)
-- > import Data.ByteString.Char8
-- > import Network.HTTP.Types (status200)
-- > import Network.Wai
-- > import Network.Wai.Handler.Warp
-- > import Network.Wai.Logger
-- > import System.IO
-- >
-- > main :: IO ()
-- > main = do
-- > logger <- stdoutApacheLoggerInit FromSocket
-- > run 3000 $ logapp logger
-- >
-- > logapp :: ApacheLogger -> Application
-- > logapp logger req = do
-- > let status = status200
-- > len = 4
-- > liftIO $ logger req status (Just len)
-- > liftIO $ hFlush stdout
-- > return $ ResponseBuilder status
-- > [("Content-Type", "text/plain")
-- > ,("Content-Length", pack (show len))]
-- > $ fromByteString "PONG"
--
-- Low level sample code:
--
-- > {-# LANGUAGE OverloadedStrings #-}
-- > module Main where
-- >
-- > import Blaze.ByteString.Builder (fromByteString)
-- > import Control.Monad.IO.Class (liftIO)
-- > import Data.ByteString.Char8
-- > import Network.HTTP.Types (status200)
-- > import Network.Wai
-- > import Network.Wai.Handler.Warp
-- > import Network.Wai.Logger
-- > import System.IO
-- > import System.Log.FastLogger
-- >
-- > main :: IO ()
-- > main = do
-- > dref <- dateInit
-- > run 3000 $ logapp dref
-- >
-- > logapp :: DateRef -> Application
-- > logapp dref req = do
-- > date <- liftIO $ getDate dref
-- > let status = status200
-- > len = 4
-- > liftIO $ hPutLogStr stdout $ apacheFormat FromSocket date req status (Just len)
-- > liftIO $ hFlush stdout
-- > return $ ResponseBuilder status
-- > [("Content-Type", "text/plain")
-- > ,("Content-Length", pack (show len))]
-- > $ fromByteString "PONG"
module Network.Wai.Logger (
ApacheLogger
, stdoutApacheLoggerInit
, module Network.Wai.Logger.Format
, module Network.Wai.Logger.Date
, module Network.Wai.Logger.Utils
) where
import Control.Applicative
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Logger.Date
import Network.Wai.Logger.Format
import Network.Wai.Logger.Utils
import System.IO
import System.Log.FastLogger
-- | Apache style logger for WAI
type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()
-- | Obtaining Apache style logger to stdout
stdoutApacheLoggerInit :: IPAddrSource -> IO ApacheLogger
stdoutApacheLoggerInit ipsrc = stdoutLogger ipsrc <$> dateInit
stdoutLogger :: IPAddrSource -> DateRef -> ApacheLogger
stdoutLogger ipsrc dateref req status msiz =
getDate dateref >>= hPutLogStr stdout . logmsg >> hFlush stdout
where
logmsg date = apacheFormat ipsrc date req status msiz
|