module System.Log.MonadLogger.Syslog
( runSyslogLoggingT
, syslogOutput
, defaultSyslogOutput
, formattedSyslogOutput
)
where
import Control.Monad.IO.Class (MonadIO ())
import Control.Monad.Logger
import System.Posix.Syslog
import Data.Text (unpack)
import System.Log.FastLogger (fromLogStr)
import qualified Data.ByteString.Char8 as BS8
runSyslogLoggingT :: MonadIO m => LoggingT m a -> m a
runSyslogLoggingT = (`runLoggingT` syslogOutput)
syslogOutput :: Loc -> LogSource -> LogLevel -> LogStr -> IO ()
syslogOutput = defaultSyslogOutput
defaultSyslogOutput :: Loc -> LogSource -> LogLevel -> LogStr -> IO ()
defaultSyslogOutput = formattedSyslogOutput defaultLogStr
formattedSyslogOutput :: (Loc -> LogSource -> LogLevel -> LogStr -> LogStr)
-> Loc
-> LogSource
-> LogLevel
-> LogStr
-> IO ()
formattedSyslogOutput f l s level msg =
syslog (levelToPriority level)
(BS8.unpack (fromLogStr (f l s level msg)))
levelToPriority :: LogLevel -> Priority
levelToPriority LevelDebug = Debug
levelToPriority LevelInfo = Info
levelToPriority LevelWarn = Warning
levelToPriority LevelError = Error
levelToPriority (LevelOther level) =
case level of
"Emergency" -> Emergency
"Alert" -> Alert
"Critical" -> Critical
"Notice" -> Notice
_ -> error $ "unknown log level: " ++ unpack level