{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE RecordWildCards #-} module Logging.Handler.FileHandler ( FileHandler(..) ) where import Data.IORef import GHC.Generics import System.IO import Text.Format import Logging.Class import Logging.Filter import Logging.Level import Logging.Prelude -- | 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 -- ^ Don't open file manually, initialized as -- __'IORef' undefined__ and use 'open' or -- "Logger.Manager.initialize" } 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