log4hs 0.2.0.0 → 0.3.0.0
raw patch · 5 files changed
+94/−3 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Logging.Aeson: instance Data.Aeson.Types.FromJSON.FromJSON (GHC.Types.IO Logging.Types.Handlers.RotatingFileHandler.RotatingFileHandler)
+ Logging.Types: RotatingFileHandler :: Level -> Filterer -> Format1 -> FilePath -> TextEncoding -> Int -> Int -> IORef Handle -> RotatingFileHandler
+ Logging.Types: [$sel:backupCount:RotatingFileHandler] :: RotatingFileHandler -> Int
+ Logging.Types: [$sel:encoding:RotatingFileHandler] :: RotatingFileHandler -> TextEncoding
+ Logging.Types: [$sel:file:RotatingFileHandler] :: RotatingFileHandler -> FilePath
+ Logging.Types: [$sel:filterer:RotatingFileHandler] :: RotatingFileHandler -> Filterer
+ Logging.Types: [$sel:formatter:RotatingFileHandler] :: RotatingFileHandler -> Format1
+ Logging.Types: [$sel:level:RotatingFileHandler] :: RotatingFileHandler -> Level
+ Logging.Types: [$sel:maxBytes:RotatingFileHandler] :: RotatingFileHandler -> Int
+ Logging.Types: [$sel:stream:RotatingFileHandler] :: RotatingFileHandler -> IORef Handle
+ Logging.Types: data RotatingFileHandler
Files
- ChangeLog.md +2/−1
- log4hs.cabal +3/−2
- src/Logging/Aeson.hs +19/−0
- src/Logging/Types/Handlers.hs +2/−0
- src/Logging/Types/Handlers/RotatingFileHandler.hs +68/−0
ChangeLog.md view
@@ -1,3 +1,4 @@ # Changelog for log4hs -## Unreleased changes+## V0.3.0+- Add `RotatingFileHandler` (without unit tests)
log4hs.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 8d633b37fcc55dd17512ea7e3f2351a1e6b89b9fb459303951dd3039c1bb8bed+-- hash: e7e350195d12d645cff1909da7ee473c97ec7d76c3116dc59cd50b3d7d294f14 name: log4hs-version: 0.2.0.0+version: 0.3.0.0 synopsis: A python logging style log library description: Please see the http://hackage.haskell.org/package/log4hs category: logging@@ -36,6 +36,7 @@ Logging.Types.Filter Logging.Types.Handlers Logging.Types.Handlers.FileHandler+ Logging.Types.Handlers.RotatingFileHandler Logging.Types.Handlers.StreamHandler Logging.Types.Level Logging.Types.Logger
src/Logging/Aeson.hs view
@@ -156,6 +156,22 @@ return $ FileHandler level filterer formatter file encoding' stream +instance FromJSON (IO RotatingFileHandler) where+ parseJSON = withObject "RotatingFileHandler" $ \v -> do+ level <- v .:? "level" .!= def+ filterer <- v .:? "filterer" .!= []+ formatter <- v .:? "formatter" .!= ""+ file <- v .:? "file" .!= "log4hs.log"+ encoding <- v .:? "encoding" .!= (show utf8)+ maxBytes <- v .:? "maxBytes" .!= 102400000+ backupCount <- v .:? "maxBytes" .!= 5+ return $ do+ stream <- newIORef undefined+ encoding' <- mkTextEncoding encoding+ return $ RotatingFileHandler level filterer formatter file encoding'+ maxBytes backupCount stream++ instance FromJSON (IO SomeHandler) where parseJSON = withObject "Handler" $ \v -> (v .: "type") >>= (`parseHandler` v) where@@ -166,6 +182,9 @@ parseHandler "FileHandler" v = do hdlIo <- parseJSON (Object v) return $ toHandler <$> (hdlIo :: IO FileHandler)+ parseHandler "RotatingFileHandler" v = do+ hdlIo <- parseJSON (Object v)+ return $ toHandler <$> (hdlIo :: IO RotatingFileHandler) instance FromJSON (M.Map String Format1 -> IO SomeHandler) where
src/Logging/Types/Handlers.hs view
@@ -1,7 +1,9 @@ module Logging.Types.Handlers ( module Logging.Types.Handlers.StreamHandler , module Logging.Types.Handlers.FileHandler+ , module Logging.Types.Handlers.RotatingFileHandler ) where import Logging.Types.Handlers.FileHandler+import Logging.Types.Handlers.RotatingFileHandler import Logging.Types.Handlers.StreamHandler
+ src/Logging/Types/Handlers/RotatingFileHandler.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE RecordWildCards #-}++module Logging.Types.Handlers.RotatingFileHandler+ ( RotatingFileHandler(..)+ ) where++import Control.Monad+import Data.IORef+import GHC.Generics+import System.IO+import Text.Format++import Logging.Types.Class+import Logging.Types.Filter+import Logging.Types.Level+import Logging.Utils+import System.IO.Extra+++-- | A handler type which writes logging records, appropriately formatted,+-- to a file, it will rotate when file is too large.+--+-- UNTESTED+--+-- Since 0.3.0+--+data RotatingFileHandler = RotatingFileHandler { level :: Level+ , filterer :: Filterer+ , formatter :: Format1+ , file :: FilePath+ , encoding :: TextEncoding+ , maxBytes :: Int+ , backupCount :: Int+ , stream :: IORef Handle+ } deriving (Generic, Eq)++instance Handler RotatingFileHandler where+ open RotatingFileHandler{..} =+ atomicWriteIORef stream =<< openLogFile file encoding++ emit RotatingFileHandler{..} rcd = do+ let msg = format1 formatter rcd+ rollover $ length msg+ stream' <- readIORef stream+ hPutStrLn stream' msg+ hFlush stream'+ where+ rollover :: Int -> IO ()+ rollover mlen = do+ stream' <- readIORef stream+ pos <- hTell =<< readIORef stream+ when (fromEnum pos + mlen >= maxBytes && backupCount > 0) $ do+ hClose stream'+ rotateNext $ backupCount - 1+ rotateFile file $ modifyBaseName file (++ ".1")++ addSuffix :: String -> Int -> String+ addSuffix src suffix = src ++ "." ++ (show suffix)++ rotateNext :: Int -> IO ()+ rotateNext n = when (n > 0) $ do+ let src = modifyBaseName file $ flip addSuffix n+ dest = modifyBaseName file $ flip addSuffix $ n + 1+ rotateFile src dest++ close RotatingFileHandler{..} = hClose =<< readIORef stream