fast-logger 0.2.2 → 0.3.0
raw patch · 3 files changed
+39/−55 lines, 3 filesdep +date-cachedep −HUnitdep −QuickCheckPVP ok
version bump matches the API change (PVP)
Dependencies added: date-cache
Dependencies removed: HUnit, QuickCheck
API changes (from Hackage documentation)
- System.Log.FastLogger.Date: data DateRef
- System.Log.FastLogger.Date: dateInit :: IO DateRef
- System.Log.FastLogger.Date: getDate :: DateRef -> IO ZonedDate
- System.Log.FastLogger.Date: instance Eq DateCache
- System.Log.FastLogger.Date: instance Show DateCache
+ System.Log.FastLogger: mkLogger2 :: Bool -> Handle -> (DateCacheGetter, DateCacheCloser) -> IO Logger
+ System.Log.FastLogger.Date: zonedDateCacheConf :: DateCacheConf EpochTime
Files
- System/Log/FastLogger.hs +22/−9
- System/Log/FastLogger/Date.hs +15/−43
- fast-logger.cabal +2/−3
System/Log/FastLogger.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE NoImplicitPrelude, RecordWildCards #-} {-# LANGUAGE FlexibleInstances, BangPatterns #-}+{-# LANGUAGE OverloadedStrings #-} -- | Fast logging system to copy log data directly to Handle buffer. @@ -7,6 +8,7 @@ -- * Logger Logger , mkLogger+ , mkLogger2 , renewLogger , rmLogger -- * Logging@@ -16,15 +18,15 @@ -- * Strings , LogStr(..) , ToLogStr(..)- -- * Misc functions+ -- * Date , loggerDate+ , module System.Log.FastLogger.Date -- * File rotation , module System.Log.FastLogger.File ) where import Blaze.ByteString.Builder import Blaze.ByteString.Builder.Char8 (fromString)-import Control.Applicative import Control.Monad import qualified Data.ByteString as BS import Data.ByteString.Internal (ByteString(..), c2w)@@ -44,6 +46,7 @@ import GHC.IORef import GHC.Num import GHC.Real+import System.Date.Cache import System.IO import System.Log.FastLogger.Date import System.Log.FastLogger.File@@ -56,9 +59,10 @@ -- | Abstract data type for logger. data Logger = Logger {- loggerAutoFlush :: Bool- , loggerHandle :: Handle- , loggerDateRef :: DateRef+ loggerAutoFlush :: Bool+ , loggerHandle :: Handle+ , loggerDateGetter :: DateCacheGetter+ , loggerDateCloser :: DateCacheCloser } logBufSize :: Int@@ -68,12 +72,21 @@ initHandle hdl = hSetBuffering hdl (BlockBuffering (Just logBufSize)) -- | Creates a 'Logger' from the given handle.+-- ('ondemandDateCacher' 'zonedDateCacheConf') is used as a Date getter. mkLogger :: Bool -- ^ Automatically flush on each loggerPut? -> Handle -- ^ If 'Handle' is associated with a file, 'AppendMode' must be used. -> IO Logger-mkLogger autoFlush hdl = do+mkLogger autoFlush hdl =+ ondemandDateCacher zonedDateCacheConf >>= mkLogger2 autoFlush hdl++-- | Creates a 'Logger' from the given handle.+mkLogger2 :: Bool -- ^ Automatically flush on each loggerPut?+ -> Handle -- ^ If 'Handle' is associated with a file, 'AppendMode' must be used.+ -> (DateCacheGetter, DateCacheCloser) -- ^ Date getter/closer. E.g. ('clockDateCacher' 'zonedDateCacheConf') + -> IO Logger+mkLogger2 autoFlush hdl (getter,closer) = do initHandle hdl- Logger autoFlush hdl <$> dateInit+ return $ Logger autoFlush hdl getter closer -- | Creates a new 'Logger' from old one by replacing 'Handle'. -- The new 'Handle' automatically inherits the file mode of@@ -89,7 +102,7 @@ -- | Destroy a 'Logger' by closing internal 'Handle'. rmLogger :: Logger -> IO ()-rmLogger (Logger _ hdl _) = hClose hdl+rmLogger lgr = hClose (loggerHandle lgr) >> loggerDateCloser lgr -- | A date type to contain 'String' and 'ByteString'. -- This data is exported so that format can be defined.@@ -191,4 +204,4 @@ -- | Obtaining date string from 'Logger'. loggerDate :: Logger -> IO ZonedDate-loggerDate logger = getDate $ loggerDateRef logger+loggerDate logger = loggerDateGetter logger
System/Log/FastLogger/Date.hs view
@@ -2,63 +2,35 @@ module System.Log.FastLogger.Date ( ZonedDate- , DateRef- , dateInit- , getDate+ , zonedDateCacheConf ) where -import Control.Applicative-import Data.ByteString (ByteString)-import Data.IORef+import Data.ByteString+import System.Date.Cache #if WINDOWS import qualified Data.ByteString.Char8 as BS import Data.Time import System.Locale-#define TIME UTCTime-#define GETTIME getCurrentTime #else import Data.UnixTime import System.Posix (EpochTime, epochTime)-#define TIME EpochTime-#define GETTIME epochTime #endif -- | A type for zoned date. type ZonedDate = ByteString -data DateCache = DateCache {- timeKey :: !TIME- , zonedDate :: !ZonedDate- } deriving (Eq, Show)---- | Reference to the 'ZonedDate' cache.-newtype DateRef = DateRef (IORef DateCache)---- | Getting 'ZonedDate' from the 'ZonedDate' cache.-getDate :: DateRef -> IO ZonedDate-getDate (DateRef ref) = do- newEt <- GETTIME- cache <- readIORef ref- let oldEt = timeKey cache- if oldEt == newEt then- return $ zonedDate cache- else do- newCache <- newDate newEt- writeIORef ref newCache- return $ zonedDate newCache--newDate :: TIME -> IO DateCache #if WINDOWS-newDate et = DateCache et . format <$> toZonedTime et- where- format = BS.pack . formatTime defaultTimeLocale "%d/%b/%Y:%T %z"- toZonedTime = utcToLocalZonedTime+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-newDate et = return $ DateCache et $ toZonedTime et- where- toZonedTime = formatUnixTime "%d/%b/%Y:%T %z" . fromEpochTime+zonedDateCacheConf :: DateCacheConf EpochTime+zonedDateCacheConf = DateCacheConf {+ getTime = epochTime+ , formatDate = return . formatUnixTime "%d/%b/%Y:%T %z" . fromEpochTime+ } #endif---- | Initializing the 'ZonedDate' cache.-dateInit :: IO DateRef-dateInit = DateRef <$> (GETTIME >>= newDate >>= newIORef)
fast-logger.cabal view
@@ -1,5 +1,5 @@ Name: fast-logger-Version: 0.2.2+Version: 0.3.0 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3@@ -18,6 +18,7 @@ Build-Depends: base >= 4 && < 5 , blaze-builder , bytestring+ , date-cache >= 0.3 , directory , filepath , text@@ -36,8 +37,6 @@ Ghc-Options: -Wall Build-Depends: base >= 4 && < 5- , HUnit- , QuickCheck , bytestring , fast-logger , hspec