fast-logger 2.0.3 → 2.1.0
raw patch · 3 files changed
+57/−38 lines, 3 files
Files
- System/Log/FastLogger.hs +23/−15
- System/Log/FastLogger/LogStr.hs +32/−21
- fast-logger.cabal +2/−2
System/Log/FastLogger.hs view
@@ -4,7 +4,6 @@ -- * Creating a logger set BufSize , defaultBufSize- , logOpen , LoggerSet , newLoggerSet , renewLoggerSet@@ -13,8 +12,8 @@ -- * Log messages , LogStr , ToLogStr(..)+ , fromLogStr , logStrLength- , logStrBuilder -- * Writing a log message , pushLogStr -- * Flushing buffered log messages@@ -27,8 +26,9 @@ import Control.Concurrent (getNumCapabilities, myThreadId, threadCapability, takeMVar) import Control.Monad (when, replicateM) import Data.Array (Array, listArray, (!))+import Data.Maybe (isJust) import GHC.IO.Device (close)-import GHC.IO.FD (FD(..), openFile)+import GHC.IO.FD (FD(..), openFile, stdout) import GHC.IO.IOMode (IOMode(..)) import System.Log.FastLogger.File import System.Log.FastLogger.IO@@ -48,20 +48,25 @@ -- The number of loggers is the capabilities of GHC RTS. -- You can specify it with \"+RTS -N\<x\>\". -- A buffer is prepared for each capability.-data LoggerSet = LoggerSet (IORef FD) (Array Int Logger)+data LoggerSet = LoggerSet (Maybe FilePath) (IORef FD) (Array Int Logger) -- | Creating a new 'LoggerSet'.-newLoggerSet :: BufSize -> FD -> IO LoggerSet-newLoggerSet size fd = do+-- If 'Nothing' is specified to the second argument,+-- stdout is used.+newLoggerSet :: BufSize -> Maybe FilePath -> IO LoggerSet+newLoggerSet size mfile = do+ fd <- case mfile of+ Nothing -> return stdout+ Just file -> logOpen file n <- getNumCapabilities loggers <- replicateM n $ newLogger size let arr = listArray (0,n-1) loggers fref <- newIORef fd- return $ LoggerSet fref arr+ return $ LoggerSet mfile fref arr -- | Writing a log message to the corresponding buffer. pushLogStr :: LoggerSet -> LogStr -> IO ()-pushLogStr (LoggerSet fref arr) logmsg = do+pushLogStr (LoggerSet _ fref arr) logmsg = do (i, _) <- myThreadId >>= threadCapability let logger = arr ! i fd <- readIORef fref@@ -69,28 +74,31 @@ -- | Flushing log messages in buffers. flushLogStr :: LoggerSet -> IO ()-flushLogStr (LoggerSet fref arr) = do+flushLogStr (LoggerSet _ fref arr) = do n <- getNumCapabilities fd <- readIORef fref mapM_ (flushIt fd) [0..n-1] where flushIt fd i = flushLog fd (arr ! i) --- | Renewing 'FD' in 'LoggerSet'. Old 'FD' is closed.-renewLoggerSet :: LoggerSet -> FD -> IO ()-renewLoggerSet (LoggerSet fref _) newfd = do+-- | Renewing the internal file information in 'LoggerSet'.+renewLoggerSet :: LoggerSet -> IO ()+renewLoggerSet (LoggerSet Nothing _ _) = return ()+renewLoggerSet (LoggerSet (Just file) fref _) = do+ newfd <- logOpen file oldfd <- atomicModifyIORef' fref (\fd -> (newfd, fd)) close oldfd --- | Flushing the buffers, closing 'FD' and freeing the buffers.+-- | Flushing the buffers, closing the internal file information+-- and freeing the buffers. rmLoggerSet :: LoggerSet -> IO ()-rmLoggerSet (LoggerSet fref arr) = do+rmLoggerSet (LoggerSet mfile fref arr) = do n <- getNumCapabilities fd <- readIORef fref let nums = [0..n-1] mapM_ (flushIt fd) nums mapM_ freeIt nums- when (fdFD fd /= 1) $ close fd+ when (isJust mfile) $ close fd where flushIt fd i = flushLog fd (arr ! i) freeIt i = do
System/Log/FastLogger/LogStr.hs view
@@ -4,22 +4,25 @@ module System.Log.FastLogger.LogStr ( Builder , LogStr(..)+ , logStrLength+ , fromLogStr , ToLogStr(..) , mempty , (<>) ) where #if MIN_VERSION_bytestring(0,10,2)-import Data.ByteString.Builder (Builder, byteString)+import Data.ByteString.Builder (Builder)+import qualified Data.ByteString.Builder as B #else-import qualified Blaze.ByteString.Builder as BB (fromByteString)+import qualified Blaze.ByteString.Builder as BB import Blaze.ByteString.Builder.Internal.Types as BB (Builder(..)) #endif-import Data.ByteString.Internal (ByteString(..))-import Data.Monoid (Monoid, mempty, mappend) import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as S8-import qualified Data.ByteString.Lazy as L+import Data.ByteString.Internal (ByteString(..))+import qualified Data.ByteString.Lazy as BL+import Data.Monoid (Monoid, mempty, mappend) #if MIN_VERSION_base(4,5,0) import Data.Monoid ((<>)) #endif@@ -36,23 +39,27 @@ (<>) = mappend #endif -#if !MIN_VERSION_bytestring(0,10,2)-byteString :: ByteString -> Builder-byteString = BB.fromByteString+toBuilder :: ByteString -> Builder+#if MIN_VERSION_bytestring(0,10,2)+toBuilder = B.byteString+#else+toBuilder = BB.fromByteString #endif +fromBuilder :: Builder -> ByteString+#if MIN_VERSION_bytestring(0,10,2)+fromBuilder = BL.toStrict . B.toLazyByteString+#else+fromBuilder = BB.toByteString+#endif+ ---------------------------------------------------------------- -- | Log message builder. Use ('<>') to append two LogStr in O(1).-data LogStr = LogStr {- -- | Obtaining the length of 'LogStr'.- logStrLength :: !Int- -- | Obtaining the 'Builder' of 'LogStr'.- , logStrBuilder :: Builder- }+data LogStr = LogStr !Int Builder instance Monoid LogStr where- mempty = LogStr 0 (byteString BS.empty)+ mempty = LogStr 0 (toBuilder BS.empty) LogStr s1 b1 `mappend` LogStr s2 b2 = LogStr (s1 + s2) (b1 <> b2) instance IsString LogStr where@@ -64,9 +71,9 @@ instance ToLogStr LogStr where toLogStr = id instance ToLogStr S8.ByteString where- toLogStr = fromByteString-instance ToLogStr L.ByteString where- toLogStr = fromByteString . S8.concat . L.toChunks+ toLogStr bs = LogStr (BS.length bs) (toBuilder bs)+instance ToLogStr BL.ByteString where+ toLogStr = toLogStr . S8.concat . BL.toChunks instance ToLogStr String where toLogStr = toLogStr . TL.pack instance ToLogStr T.Text where@@ -74,6 +81,10 @@ instance ToLogStr TL.Text where toLogStr = toLogStr . TL.encodeUtf8 --- | Creating 'LogStr'-fromByteString :: ByteString -> LogStr-fromByteString bs = LogStr (BS.length bs) (byteString bs)+-- | Obtaining the length of 'LogStr'.+logStrLength :: LogStr -> Int+logStrLength (LogStr n _) = n++-- | Converting 'LogStr' to 'ByteString'.+fromLogStr :: LogStr -> ByteString+fromLogStr (LogStr _ builder) = fromBuilder builder
fast-logger.cabal view
@@ -1,5 +1,5 @@ Name: fast-logger-Version: 2.0.3+Version: 2.1.0 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3@@ -14,7 +14,7 @@ GHC-Options: -Wall Exposed-Modules: System.Log.FastLogger System.Log.FastLogger.File- System.Log.FastLogger.IO+ Other-Modules: System.Log.FastLogger.IO System.Log.FastLogger.IORef System.Log.FastLogger.LogStr System.Log.FastLogger.Logger