magicbane-0.2.0: library/Magicbane/Logging.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE OverloadedStrings, UnicodeSyntax, FlexibleContexts, FlexibleInstances, UndecidableInstances #-}
-- | Provides logging via monad-logger/fast-logger in a Magicbane app context.
module Magicbane.Logging (
module Magicbane.Logging
, module X
) where
import Data.Has
import Data.Monoid
import Control.Monad.IO.Class
import Control.Monad.Logger as X
import Control.Monad.Reader
import System.Log.FastLogger
import System.Log.FastLogger as X (LogType(..), defaultBufSize)
newtype ModLogger = ModLogger (Loc → LogSource → LogLevel → LogStr → IO ())
instance (Has ModLogger α, Monad μ, MonadIO μ, MonadReader α μ) ⇒ MonadLogger μ where
monadLoggerLog loc src lvl msg = asks getter >>= \(ModLogger f) → liftIO (f loc src lvl $ toLogStr msg)
instance (Has ModLogger α, MonadIO μ, MonadReader α μ) ⇒ MonadLoggerIO μ where
askLoggerIO = (\(ModLogger f) → f) <$> asks getter
-- | Creates a logger module. Also returns the logger itself for using outside of your Magicbane app (e.g. in some WAI middleware).
newLogger ∷ LogType → IO (TimedFastLogger, ModLogger)
newLogger logtype = do
tc ← newTimeCache simpleTimeFormat'
(fl, _) ← newTimedFastLogger tc logtype
-- forget cleanup because the logger will exist for the lifetime of the (OS) process
return (fl, ModLogger $ \loc src lvl msg → fl (\t → toLogStr (t <> " ") <> defaultLogStr loc src lvl msg))