fast-logger 3.0.3 → 3.0.4
raw patch · 7 files changed
+53/−28 lines, 7 filesdep ~directorydep ~filepathPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: directory, filepath
API changes (from Hackage documentation)
+ System.Log.FastLogger: newFastLogger1 :: LogType' v -> IO (v -> IO (), IO ())
+ System.Log.FastLogger.Internal: invalidFD :: FD
+ System.Log.FastLogger.Internal: isFDValid :: FD -> Bool
- System.Log.FastLogger.LoggerSet: newFileLoggerSet :: BufSize -> FilePath -> IO LoggerSet
+ System.Log.FastLogger.LoggerSet: newFileLoggerSet :: BufSize -> Maybe Int -> FilePath -> IO LoggerSet
- System.Log.FastLogger.LoggerSet: newLoggerSet :: BufSize -> Maybe FilePath -> IO LoggerSet
+ System.Log.FastLogger.LoggerSet: newLoggerSet :: BufSize -> Maybe Int -> Maybe FilePath -> IO LoggerSet
Files
- ChangeLog.md +5/−0
- System/Log/FastLogger.hs +14/−7
- System/Log/FastLogger/FileIO.hs +10/−1
- System/Log/FastLogger/Logger.hs +1/−1
- System/Log/FastLogger/LoggerSet.hs +18/−14
- fast-logger.cabal +1/−1
- test/FastLoggerSpec.hs +4/−4
ChangeLog.md view
@@ -1,3 +1,8 @@+## 3.0.4++* New API: `newFastLogger1` which use only one capability.+* Making `FD` safer with `invalidFD`.+ ## 3.0.3 * Dropping support of GHC 7.x.
System/Log/FastLogger.hs view
@@ -15,6 +15,7 @@ , LogType , LogType'(..) , newFastLogger+ , newFastLogger1 , withFastLogger -- * Timed FastLogger , TimedFastLogger@@ -101,11 +102,17 @@ -- -- > newFastLogger :: LogType -> IO (FastLogger, IO ()) newFastLogger :: LogType' v -> IO (v -> IO (), IO ())-newFastLogger typ = case typ of+newFastLogger typ = newFastLoggerCore Nothing typ++newFastLogger1 :: LogType' v -> IO (v -> IO (), IO ())+newFastLogger1 typ = newFastLoggerCore (Just 1) typ++newFastLoggerCore :: Maybe Int -> LogType' v -> IO (v -> IO (), IO ())+newFastLoggerCore mn typ = case typ of LogNone -> return (const noOp, noOp) LogStdout bsize -> newStdoutLoggerSet bsize >>= stdLoggerInit LogStderr bsize -> newStderrLoggerSet bsize >>= stdLoggerInit- LogFileNoRotate fp bsize -> newFileLoggerSet bsize fp >>= fileLoggerInit+ LogFileNoRotate fp bsize -> newFileLoggerSet bsize mn fp >>= fileLoggerInit LogFile fspec bsize -> rotateLoggerInit fspec bsize LogFileTimedRotate fspec bsize -> timedRotateLoggerInit fspec bsize LogCallback cb flush -> return (\str -> cb str >> flush, noOp)@@ -113,7 +120,7 @@ stdLoggerInit lgrset = return (pushLogStr lgrset, rmLoggerSet lgrset) fileLoggerInit lgrset = return (pushLogStr lgrset, rmLoggerSet lgrset) rotateLoggerInit fspec bsize = do- lgrset <- newFileLoggerSet bsize $ log_file fspec+ lgrset <- newFileLoggerSet bsize mn $ log_file fspec ref <- newIORef (0 :: Int) mvar <- newMVar () let logger str = do@@ -124,7 +131,7 @@ timedRotateLoggerInit fspec bsize = do cache <- newTimeCache $ timed_timefmt fspec now <- cache- lgrset <- newFileLoggerSet bsize $ prefixTime now $ timed_log_file fspec+ lgrset <- newFileLoggerSet bsize mn $ prefixTime now $ timed_log_file fspec ref <- newIORef now mvar <- newMVar lgrset let logger str = do@@ -148,7 +155,7 @@ LogNone -> return (const noOp, noOp) LogStdout bsize -> newStdoutLoggerSet bsize >>= stdLoggerInit LogStderr bsize -> newStderrLoggerSet bsize >>= stdLoggerInit- LogFileNoRotate fp bsize -> newFileLoggerSet bsize fp >>= fileLoggerInit+ LogFileNoRotate fp bsize -> newFileLoggerSet bsize Nothing fp >>= fileLoggerInit LogFile fspec bsize -> rotateLoggerInit fspec bsize LogFileTimedRotate fspec bsize -> timedRotateLoggerInit fspec bsize LogCallback cb flush -> return (\f -> tgetter >>= cb . f >> flush, noOp)@@ -156,7 +163,7 @@ stdLoggerInit lgrset = return ( \f -> tgetter >>= pushLogStr lgrset . f, rmLoggerSet lgrset) fileLoggerInit lgrset = return (\f -> tgetter >>= pushLogStr lgrset . f, rmLoggerSet lgrset) rotateLoggerInit fspec bsize = do- lgrset <- newFileLoggerSet bsize $ log_file fspec+ lgrset <- newFileLoggerSet bsize Nothing $ log_file fspec ref <- newIORef (0 :: Int) mvar <- newMVar () let logger f = do@@ -168,7 +175,7 @@ timedRotateLoggerInit fspec bsize = do cache <- newTimeCache $ timed_timefmt fspec now <- cache- lgrset <- newFileLoggerSet bsize $ prefixTime now $ timed_log_file fspec+ lgrset <- newFileLoggerSet bsize Nothing $ prefixTime now $ timed_log_file fspec ref <- newIORef now mvar <- newMVar lgrset let logger f = do
System/Log/FastLogger/FileIO.hs view
@@ -25,4 +25,13 @@ writeRawBufferPtr2FD :: IORef FD -> Ptr Word8 -> Int -> IO Int writeRawBufferPtr2FD fdref bf len = do fd <- readIORef fdref- fromIntegral <$> writeRawBufferPtr "write" fd bf 0 (fromIntegral len)+ if isFDValid fd then+ fromIntegral <$> writeRawBufferPtr "write" fd bf 0 (fromIntegral len)+ else+ return (-1)++invalidFD :: POSIX.FD+invalidFD = stdout { POSIX.fdFD = -1 }++isFDValid :: POSIX.FD -> Bool+isFDValid fd = POSIX.fdFD fd /= -1
System/Log/FastLogger/Logger.hs view
@@ -83,5 +83,5 @@ where loop bf !len = do written <- writeRawBufferPtr2FD fdref bf len- when (written < len) $+ when (0 <= written && written < len) $ loop (bf `plusPtr` fromIntegral written) (len - written)
System/Log/FastLogger/LoggerSet.hs view
@@ -38,29 +38,31 @@ data LoggerSet = LoggerSet (Maybe FilePath) (IORef FD) (Array Int Logger) (IO ()) -- | Creating a new 'LoggerSet' using a file.-newFileLoggerSet :: BufSize -> FilePath -> IO LoggerSet-newFileLoggerSet size file = openFileFD file >>= newFDLoggerSet size (Just file)+newFileLoggerSet :: BufSize -> Maybe Int -> FilePath -> IO LoggerSet+newFileLoggerSet size mn file = openFileFD file >>= newFDLoggerSet size mn (Just file) -- | Creating a new 'LoggerSet' using stdout. newStdoutLoggerSet :: BufSize -> IO LoggerSet-newStdoutLoggerSet size = getStdoutFD >>= newFDLoggerSet size Nothing+newStdoutLoggerSet size = getStdoutFD >>= newFDLoggerSet size Nothing Nothing -- | Creating a new 'LoggerSet' using stderr. newStderrLoggerSet :: BufSize -> IO LoggerSet-newStderrLoggerSet size = getStderrFD >>= newFDLoggerSet size Nothing+newStderrLoggerSet size = getStderrFD >>= newFDLoggerSet size Nothing Nothing {-# DEPRECATED newLoggerSet "Use newFileLoggerSet etc instead" #-} -- | Creating a new 'LoggerSet'. -- If 'Nothing' is specified to the second argument, -- stdout is used. -- Please note that the minimum 'BufSize' is 1.-newLoggerSet :: BufSize -> Maybe FilePath -> IO LoggerSet-newLoggerSet size = maybe (newStdoutLoggerSet size) (newFileLoggerSet size)+newLoggerSet :: BufSize -> Maybe Int -> Maybe FilePath -> IO LoggerSet+newLoggerSet size mn = maybe (newStdoutLoggerSet size) (newFileLoggerSet size mn) -- | Creating a new 'LoggerSet' using a FD.-newFDLoggerSet :: BufSize -> Maybe FilePath -> FD -> IO LoggerSet-newFDLoggerSet size mfile fd = do- n <- getNumCapabilities+newFDLoggerSet :: BufSize -> Maybe Int -> Maybe FilePath -> FD -> IO LoggerSet+newFDLoggerSet size mn mfile fd = do+ n <- case mn of+ Just n' -> return n'+ Nothing -> getNumCapabilities loggers <- replicateM n $ newLogger (max 1 size) let arr = listArray (0,n-1) loggers fref <- newIORef fd@@ -121,12 +123,14 @@ -- and freeing the buffers. rmLoggerSet :: LoggerSet -> IO () rmLoggerSet (LoggerSet mfile fdref arr _) = do- let (l,u) = bounds arr- let nums = [l .. u]- mapM_ flushIt nums- mapM_ freeIt nums fd <- readIORef fdref- when (isJust mfile) $ closeFD fd+ when (isFDValid fd) $ do+ let (l,u) = bounds arr+ let nums = [l .. u]+ mapM_ flushIt nums+ mapM_ freeIt nums+ when (isJust mfile) $ closeFD fd+ writeIORef fdref invalidFD where flushIt i = flushLog fdref (arr ! i) freeIt i = do
fast-logger.cabal view
@@ -1,5 +1,5 @@ Name: fast-logger-Version: 3.0.3+Version: 3.0.4 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3
test/FastLoggerSpec.hs view
@@ -40,9 +40,9 @@ nullLogger :: IO LoggerSet #ifdef mingw32_HOST_OS-nullLogger = newFileLoggerSet 4096 "nul"+nullLogger = newFileLoggerSet 4096 Nothing "nul" #else-nullLogger = newFileLoggerSet 4096 "/dev/null"+nullLogger = newFileLoggerSet 4096 Nothing "/dev/null" #endif safeForLarge :: [Int] -> IO ()@@ -51,7 +51,7 @@ safeForLarge' :: Int -> IO () safeForLarge' n = flip finally (cleanup tmpfile) $ do cleanup tmpfile- lgrset <- newFileLoggerSet defaultBufSize tmpfile+ lgrset <- newFileLoggerSet defaultBufSize Nothing tmpfile let xs = toLogStr $ BS.pack $ take (abs n) (cycle ['a'..'z']) lf = "x" pushLogStr lgrset $ xs <> lf@@ -73,7 +73,7 @@ tmpfile = "test/temp" logAll file = do cleanup tmpfile- lgrset <- newFileLoggerSet 512 tmpfile+ lgrset <- newFileLoggerSet 512 Nothing tmpfile src <- BS.readFile file let bs = (<> "\n") . toLogStr <$> BS.lines src mapM_ (pushLogStr lgrset) bs