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 +32/−134
- Network/Wai/Logger/Apache.hs +1/−3
- Network/Wai/Logger/Date.hs +0/−88
- wai-logger.cabal +2/−5
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