{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE RecordWildCards #-} module Logging.Types.Handlers.FileHandler ( FileHandler(..) ) where 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. -- data FileHandler = FileHandler { level :: Level , filterer :: Filterer , formatter :: Format1 , file :: FilePath , encoding :: TextEncoding , stream :: IORef Handle } deriving (Generic, Eq) instance Handler FileHandler where open FileHandler{..} = atomicWriteIORef stream =<< openLogFile file encoding emit self@FileHandler{..} rcd = do stream' <- readIORef stream flip hPutStrLn (format1 formatter rcd) stream' hFlush stream' close FileHandler{..} = hClose =<< readIORef stream