wai-logger-2.2.3: A logging system for WAI

Safe HaskellNone




Apache style logger for WAI applications.

An example:

 {-# LANGUAGE OverloadedStrings #-}
 module Main where

 import Blaze.ByteString.Builder (fromByteString)
 import Control.Monad.IO.Class (liftIO)
 import qualified Data.ByteString.Char8 as BS
 import Network.HTTP.Types (status200)
 import Network.Wai (Application, responseBuilder)
 import Network.Wai.Handler.Warp (run)
 import Network.Wai.Logger (withStdoutLogger, ApacheLogger)

 main :: IO ()
 main = withStdoutLogger $ \aplogger ->
     run 3000 $ logApp aplogger

 logApp :: ApacheLogger -> Application
 logApp aplogger req = do
     liftIO $ aplogger req status (Just len)
     return $ responseBuilder status hdr msg
     status = status200
     hdr = [("Content-Type", "text/plain")
           ,("Content-Length", BS.pack (show len))]
     pong = "PONG"
     len = fromIntegral $ BS.length pong
     msg = toLogStr pong


High level functions

type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()Source

Apache style logger.

withStdoutLogger :: (ApacheLogger -> IO a) -> IO aSource

Executing a function which takes ApacheLogger. This ApacheLogger writes log message to stdout. Each buffer (4K bytes) is flushed every second.

Creating a logger

data ApacheLoggerActions Source




apacheLogger :: ApacheLogger
logRotator :: IO ()

This is obsoleted. Rotation is done on-demand. So, this is now an empty action.

logRemover :: IO ()

Removing resources relating Apache logger. E.g. flushing and deallocating internal buffers.


data IPAddrSource Source

Source from which the IP source address of the client is obtained.



From the peer address of the HTTP connection.


From X-Real-IP: or X-Forwarded-For: in the HTTP header.


From the peer address if header is not found.

data LogType Source

Logger Type.



No logging.

LogStdout BufSize

Logging to stdout. BufSize is a buffer size for each capability.

LogFile FileLogSpec BufSize

Logging to a file. BufSize is a buffer size for each capability. File rotation is done on-demand.

LogCallback (LogStr -> IO ()) (IO ()) 

data FileLogSpec

The spec for logging files

Date cacher

clockDateCacher :: IO (DateCacheGetter, DateCacheUpdater)Source

Returning DateCacheGetter and DateCacheUpdater.

Note: Since version 2.1.2, this function uses the auto-update package internally, and therefore the DateCacheUpdater value returned need not be called. To wit, the return value is in fact an empty action.

type ZonedDate = ByteStringSource

A type for zoned date.

type DateCacheUpdater = IO ()Source

Updateing cached ZonedDate. This should be called every second. See the source code of withStdoutLogger.


logCheck :: LogType -> IO ()Source

Checking if a log file can be written if LogType is LogFile.

showSockAddr :: SockAddr -> NumericAddressSource

Convert SockAddr to NumericAddress. If the address is IPv4-embedded IPv6 address, the IPv4 is extracted.