{-# 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
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