File: Logger.hs

package info (click to toggle)
haskell-wai-logger 0.1.4-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 68 kB
  • sloc: haskell: 197; makefile: 2
file content (95 lines) | stat: -rw-r--r-- 2,859 bytes parent folder | download
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