-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | A logging system for WAI
--   
--   A logging system for WAI
@package wai-logger
@version 2.3.0


-- | Apache style logger for WAI applications.
--   
--   An example:
--   
--   <pre>
--   {-# 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 -&gt;
--       run 3000 $ logApp aplogger
--   
--   logApp :: ApacheLogger -&gt; Application
--   logApp aplogger req response = do
--       liftIO $ aplogger req status (Just len)
--       response $ responseBuilder status hdr msg
--     where
--       status = status200
--       hdr = [("Content-Type", "text/plain")]
--       pong = "PONG"
--       msg = fromByteString pong
--       len = fromIntegral $ BS.length pong
--   </pre>
module Network.Wai.Logger

-- | Apache style logger.
type ApacheLogger = Request -> Status -> Maybe Integer -> IO ()

-- | Executing a function which takes <a>ApacheLogger</a>. This
--   <a>ApacheLogger</a> writes log message to stdout. Each buffer (4K
--   bytes) is flushed every second.
withStdoutLogger :: (ApacheLogger -> IO a) -> IO a

-- | HTTP/2 server push logger in Apache style.
type ServerPushLogger = Request -> ByteString -> Integer -> IO ()

-- | Function set of Apache style logger.
data ApacheLoggerActions

-- | The Apache logger.
apacheLogger :: ApacheLoggerActions -> ApacheLogger

-- | The HTTP/2 server push logger.
serverpushLogger :: ApacheLoggerActions -> ServerPushLogger

-- | This is obsoleted. Rotation is done on-demand. So, this is now an
--   empty action.
logRotator :: ApacheLoggerActions -> IO ()

-- | Removing resources relating to Apache logger. E.g. flushing and
--   deallocating internal buffers.
logRemover :: ApacheLoggerActions -> IO ()

-- | Creating <a>ApacheLogger</a> according to <a>LogType</a>.
initLogger :: IPAddrSource -> LogType -> IO FormattedTime -> IO ApacheLoggerActions

-- | Source from which the IP source address of the client is obtained.
data IPAddrSource

-- | From the peer address of the HTTP connection.
FromSocket :: IPAddrSource

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

-- | From the peer address if header is not found.
FromFallback :: IPAddrSource

-- | Logger Type.
data LogType :: *

-- | No logging.
LogNone :: LogType

-- | Logging to stdout. <a>BufSize</a> is a buffer size
LogStdout :: BufSize -> LogType

-- | Logging to stdout. <a>BufSize</a> is a buffer size for each
--   capability.
LogStderr :: BufSize -> LogType

-- | Logging to a file. <a>BufSize</a> is a buffer size for each
--   capability.
LogFileNoRotate :: FilePath -> BufSize -> LogType

-- | Logging to a file. <a>BufSize</a> is a buffer size for each
--   capability. File rotation is done on-demand.
LogFile :: FileLogSpec -> BufSize -> LogType

-- | Logging with a log and flush action. run flush after log each message.
LogCallback :: (LogStr -> IO ()) -> IO () -> LogType

-- | The spec for logging files
data FileLogSpec :: *
FileLogSpec :: FilePath -> Integer -> Int -> FileLogSpec
[log_file] :: FileLogSpec -> FilePath

-- | Max log file size (in bytes) before requiring rotation.
[log_file_size] :: FileLogSpec -> Integer

-- | Max number of rotated log files to keep around before overwriting the
--   oldest one.
[log_backup_number] :: FileLogSpec -> Int

-- | Convert <a>SockAddr</a> to <a>NumericAddress</a>. If the address is
--   IPv4-embedded IPv6 address, the IPv4 is extracted.
showSockAddr :: SockAddr -> NumericAddress
logCheck :: LogType -> IO ()

-- | Returning <a>DateCacheGetter</a> and <a>DateCacheUpdater</a>.
--   
--   Note: Since version 2.1.2, this function uses the auto-update package
--   internally, and therefore the <tt>DateCacheUpdater</tt> value returned
--   need not be called. To wit, the return value is in fact an empty
--   action.
clockDateCacher :: IO (DateCacheGetter, DateCacheUpdater)

-- | A type for zoned date.
type ZonedDate = FormattedTime

-- | Getting cached <a>ZonedDate</a>.
type DateCacheGetter = IO ZonedDate

-- | Updateing cached <a>ZonedDate</a>. This should be called every second.
--   See the source code of <a>withStdoutLogger</a>.
type DateCacheUpdater = IO ()
