{-# LANGUAGE OverloadedStrings #-}
-- | Module provides syslog logger for simple-log
--
-- >yourFunction :: MonadLog m => m ()
-- >yourFunction = scope "your" $ log Trace "Hello"
-- >
-- >run :: IO ()
-- >run = do
-- > l <- newLog (fileCfg "log.cfg" 60) [syslog "name"]
-- > withLog l yourFunction
--
module System.Log.Syslog (
SyslogMessage(..),
syslogMsg,
toSyslog, toSyslog_,
syslog, syslog_,
Option(..), Facility(..)
) where
import System.Posix.Syslog (Option(..), Facility(..))
import qualified System.Posix.Syslog as Syslog
import qualified Data.Text as T
import System.Log.Base
data SyslogMessage = SyslogMessage {
syslogPriority :: Syslog.Priority,
syslogMessage :: String }
deriving (Eq, Show)
syslogMsg :: Converter SyslogMessage
syslogMsg (Message _ lvl path msg) = SyslogMessage (priority lvl) $ T.unpack $ T.concat [T.intercalate "/" path, "> ", msg] where
priority Trace = Syslog.Debug
priority Debug = Syslog.Debug
priority Info = Syslog.Info
priority Warning = Syslog.Warning
priority Error = Syslog.Error
priority Fatal = Syslog.Critical
toSyslog :: String -> [Option] -> Facility -> Consumer SyslogMessage
toSyslog name ops facility = Consumer withSys where
withSys f = Syslog.withSyslog name ops facility $ f $ \(SyslogMessage p str) -> Syslog.syslog p str
toSyslog_ :: String -> Consumer SyslogMessage
toSyslog_ name = Consumer withSys where
withSys f = Syslog.useSyslog name $ f $ \(SyslogMessage p str) -> Syslog.syslog p str
syslog :: String -> [Option] -> Facility -> Logger
syslog name ops facility = logger syslogMsg (toSyslog name ops facility)
syslog_ :: String -> Logger
syslog_ name = logger syslogMsg (toSyslog_ name)