packages feed

wai-logger 2.2.5 → 2.2.6

raw patch · 4 files changed

+35/−230 lines, 4 filesdep −auto-updatedep −easy-filedep ~fast-logger

Dependencies removed: auto-update, easy-file

Dependency ranges changed: fast-logger

Files

Network/Wai/Logger.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE CPP #-}+ -- | Apache style logger for WAI applications. -- -- An example:@@ -39,29 +41,24 @@   , IPAddrSource(..)   , LogType(..)   , FileLogSpec(..)-  -- * Date cacher-  , clockDateCacher-  , ZonedDate-  , DateCacheGetter-  , DateCacheUpdater   -- * Utilities-  , logCheck   , showSockAddr+  , logCheck+  -- * Backward compability+  , ZonedDate+  , clockDateCacher   ) where +#if __GLASGOW_HASKELL__ < 709 import Control.Applicative ((<$>))-import Control.AutoUpdate (mkAutoUpdate, defaultUpdateSettings, updateAction)-import Control.Concurrent (MVar, newMVar, tryTakeMVar, putMVar)-import Control.Exception (handle, SomeException(..), bracket)-import Control.Monad (when, void)+#endif+import Control.Exception (bracket)+import Control.Monad (void) import Network.HTTP.Types (Status) import Network.Wai (Request)-import System.EasyFile (getFileSize) import System.Log.FastLogger  import Network.Wai.Logger.Apache-import Network.Wai.Logger.Date-import Network.Wai.Logger.IORef import Network.Wai.Logger.IP (showSockAddr)  ----------------------------------------------------------------@@ -74,8 +71,8 @@     app aplogger   where     setup = do-        (getter, _updater) <- clockDateCacher-        apf <- initLogger FromFallback (LogStdout 4096) getter+        tgetter <- newTimeCache simpleTimeFormat+        apf <- initLogger FromFallback (LogStdout 4096) tgetter         let aplogger = apacheLogger apf             remover = logRemover apf         return (aplogger, remover)@@ -96,135 +93,36 @@   , logRemover :: IO ()   } --- | Logger Type.-data LogType = LogNone                     -- ^ 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 ())- ---------------------------------------------------------------- --- |--- Creating 'ApacheLogger' according to 'LogType'.-initLogger :: IPAddrSource -> LogType -> DateCacheGetter+-- | Creating 'ApacheLogger' according to 'LogType'.+initLogger :: IPAddrSource -> LogType -> IO FormattedTime            -> IO ApacheLoggerActions-initLogger _     LogNone             _       = noLoggerInit-initLogger ipsrc (LogStdout size)    dateget = stdoutLoggerInit ipsrc size dateget-initLogger ipsrc (LogFile spec size) dateget = fileLoggerInit ipsrc spec size dateget-initLogger ipsrc (LogCallback cb flush) dateget = callbackLoggerInit ipsrc cb flush dateget--------------------------------------------------------------------noLoggerInit :: IO ApacheLoggerActions-noLoggerInit = return ApacheLoggerActions {-    apacheLogger = noLogger-  , logRotator = noRotator-  , logRemover = noRemover-  }-  where-    noLogger _ _ _ = return ()-    noRotator = return ()-    noRemover = return ()--stdoutLoggerInit :: IPAddrSource -> BufSize -> DateCacheGetter-                 -> IO ApacheLoggerActions-stdoutLoggerInit ipsrc size dateget = do-    lgrset <- newStdoutLoggerSet size-    let logger = apache (pushLogStr lgrset) ipsrc dateget-        noRotator = return ()-        remover = rmLoggerSet lgrset-    return ApacheLoggerActions {-        apacheLogger = logger-      , logRotator = noRotator-      , logRemover = remover-      }--fileLoggerInit :: IPAddrSource -> FileLogSpec -> BufSize -> DateCacheGetter-               -> IO ApacheLoggerActions-fileLoggerInit ipsrc spec size dateget = do-    lgrset <- newFileLoggerSet size $ log_file spec-    ref <- newIORef (0 :: Int)-    mvar <- newMVar ()-    let logger a b c = do-            cnt <- decrease ref-            apache (pushLogStr lgrset) ipsrc dateget a b c-            when (cnt <= 0) $ tryRotate lgrset spec ref mvar-        noRotator = return ()-        remover = rmLoggerSet lgrset-    return ApacheLoggerActions {-        apacheLogger = logger-      , logRotator = noRotator-      , logRemover = remover-      }--decrease :: IORef Int -> IO Int-decrease ref = atomicModifyIORef' ref (\x -> (x - 1, x - 1))+initLogger ipsrc typ tgetter = do+    (fl, cleanUp) <- newFastLogger typ+    return $ ApacheLoggerActions (apache fl ipsrc tgetter) (return ()) cleanUp -callbackLoggerInit :: IPAddrSource -> (LogStr -> IO ()) -> IO () -> DateCacheGetter-                   -> IO ApacheLoggerActions-callbackLoggerInit ipsrc cb flush dateget = do-    flush' <- mkAutoUpdate defaultUpdateSettings-        { updateAction = flush-        }-    let logger a b c = apache cb ipsrc dateget a b c >> flush'-        noRotator = return ()-        remover = return ()-    return ApacheLoggerActions {-        apacheLogger = logger-      , logRotator = noRotator-      , logRemover = remover-      }+--- | Checking if a log file can be written if 'LogType' is 'LogFileNoRotate' or 'LogFile'.+logCheck :: LogType -> IO ()+logCheck LogNone          = return ()+logCheck (LogStdout _)    = return ()+logCheck (LogStderr _)    = return ()+logCheck (LogFileNoRotate fp _)  = check fp+logCheck (LogFile spec _)        = check (log_file spec)+logCheck (LogCallback _ _) = return ()  ---------------------------------------------------------------- -apache :: (LogStr -> IO ()) -> IPAddrSource -> DateCacheGetter -> ApacheLogger+apache :: (LogStr -> IO ()) -> IPAddrSource -> IO FormattedTime -> ApacheLogger apache cb ipsrc dateget req st mlen = do     zdata <- dateget     cb (apacheLogStr ipsrc zdata req st mlen) -------------------------------------------------------------------tryRotate :: LoggerSet -> FileLogSpec -> IORef Int -> MVar () -> IO ()-tryRotate lgrset spec ref mvar = bracket lock unlock rotateFiles-  where-    lock           = tryTakeMVar mvar-    unlock Nothing = return ()-    unlock _       = putMVar mvar ()-    rotateFiles Nothing = return ()-    rotateFiles _       = do-        msiz <- getSize-        case msiz of-            -- A file is not available.-            -- So, let's set a big value to the counter so that-            -- this function is not called frequently.-            Nothing -> writeIORef ref 1000000-            Just siz-                | siz > limit -> do-                    rotate spec-                    renewLoggerSet lgrset-                    writeIORef ref $ estimate limit-                | otherwise -> do-                    writeIORef ref $ estimate (limit - siz)-    file = log_file spec-    limit = log_file_size spec-    getSize = handle (\(SomeException _) -> return Nothing) $ do-        -- The log file is locked by GHC.-        -- We need to get its file size by the way not using locks.-        Just . fromIntegral <$> getFileSize file-    -- 200 is an ad-hoc value for the length of log line.-    estimate x = fromInteger (x `div` 200)+--------------------------------------------------------------- -----------------------------------------------------------------+type ZonedDate = FormattedTime --- |--- Checking if a log file can be written if 'LogType' is 'LogFile'.-logCheck :: LogType -> IO ()-logCheck LogNone          = return ()-logCheck (LogStdout _)    = return ()-logCheck (LogFile spec _) = check spec-logCheck (LogCallback _ _) = return ()+clockDateCacher :: IO (IO ZonedDate, IO ())+clockDateCacher = do+    tgetter <- newTimeCache simpleTimeFormat+    return (tgetter, return ())
Network/Wai/Logger/Apache.hs view
@@ -14,7 +14,6 @@  import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as BS-import Data.CaseInsensitive (CI) import Data.List (find) import Data.Maybe (fromMaybe) #if MIN_VERSION_base(4,5,0)@@ -24,7 +23,6 @@ #endif import Network.HTTP.Types (Status, statusCode) import Network.Wai (Request(..))-import Network.Wai.Logger.Date import Network.Wai.Logger.IP import System.Log.FastLogger @@ -42,7 +40,7 @@   | FromFallback  -- | Apache style log format.-apacheLogStr :: IPAddrSource -> ZonedDate -> Request -> Status -> Maybe Integer -> LogStr+apacheLogStr :: IPAddrSource -> FormattedTime -> Request -> Status -> Maybe Integer -> LogStr apacheLogStr ipsrc tmstr req status msize =       toLogStr (getSourceIP ipsrc req)   <> " - - ["
− Network/Wai/Logger/Date.hs
@@ -1,88 +0,0 @@-{-# LANGUAGE CPP, OverloadedStrings #-}---- |--- Formatting time is slow.--- This package provides mechanisms to cache formatted date.-module Network.Wai.Logger.Date (-  -- * Types-    DateCacheGetter-  , DateCacheUpdater-  , ZonedDate-  -- * Cache configuration-  , DateCacheConf(..)-  , zonedDateCacheConf-  -- * Date cacher-  , clockDateCacher-  ) where--import Control.AutoUpdate (mkAutoUpdate, defaultUpdateSettings, updateAction)-import Data.ByteString (ByteString)-#if WINDOWS-import qualified Data.ByteString.Char8 as BS-import Data.Time (UTCTime, formatTime, getCurrentTime, utcToLocalZonedTime)-# if MIN_VERSION_time(1,5,0)-import Data.Time (defaultTimeLocale)-# else-import System.Locale (defaultTimeLocale)-# endif-#else-import Data.UnixTime (formatUnixTime, fromEpochTime)-import System.Posix (EpochTime, epochTime)-#endif---------------------------------------------------------------------- | Getting cached 'ZonedDate'.-type DateCacheGetter = IO ZonedDate--- | Updateing cached 'ZonedDate'. This should be called every second.---   See the source code of 'withStdoutLogger'.-type DateCacheUpdater = IO ()---------------------------------------------------------------------- | A type for zoned date.-type ZonedDate = ByteString--------------------------------------------------------------------data DateCacheConf t = DateCacheConf {-    -- | A function to get a time. E.g 'epochTime' and 'getCurrentTime'.-    getTime :: IO t-    -- | A function to format a time.-  , formatDate :: t -> IO ByteString-  }--#if WINDOWS--- | Zoned date cacher using UTC.-zonedDateCacheConf :: DateCacheConf UTCTime-zonedDateCacheConf = DateCacheConf {-    getTime = getCurrentTime-  , formatDate = \ut -> do-      zt <- utcToLocalZonedTime ut-      return $ BS.pack $ formatTime defaultTimeLocale "%d/%b/%Y:%T %z" zt-  }-#else--- | Zoned date cacher using UnixTime.-zonedDateCacheConf :: DateCacheConf EpochTime-zonedDateCacheConf = DateCacheConf {-    getTime = epochTime-  , formatDate = formatUnixTime "%d/%b/%Y:%T %z" . fromEpochTime-  }-#endif---------------------------------------------------------------------- |--- 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.--clockDateCacher :: IO (DateCacheGetter, DateCacheUpdater)-clockDateCacher = do-    getter <- mkAutoUpdate defaultUpdateSettings-        { updateAction = getTime zonedDateCacheConf-                     >>= formatDate zonedDateCacheConf-        }-    return (getter, return ())
wai-logger.cabal view
@@ -1,5 +1,5 @@ Name:                   wai-logger-Version:                2.2.5+Version:                2.2.6 Author:                 Kazu Yamamoto <kazu@iij.ad.jp> Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp> License:                BSD3@@ -15,17 +15,14 @@   GHC-Options:          -Wall   Exposed-Modules:      Network.Wai.Logger   Other-Modules:        Network.Wai.Logger.Apache-                        Network.Wai.Logger.Date                         Network.Wai.Logger.IP                         Network.Wai.Logger.IORef   Build-Depends:        base >= 4 && < 5-                      , auto-update                       , blaze-builder                       , byteorder                       , bytestring                       , case-insensitive-                      , easy-file >= 0.2-                      , fast-logger >= 2.2+                      , fast-logger >= 2.4.5                       , http-types                       , network                       , wai >= 2.0.0