hslogger 1.2.1 → 1.2.2
raw patch · 2 files changed
+37/−11 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- System.Log.Handler.Syslog: openlog_generic :: Socket -> SockAddr -> String -> [Option] -> Facility -> Priority -> IO SyslogHandler
+ System.Log.Handler.Syslog: openlog_generic :: Socket -> SockAddr -> SocketType -> String -> [Option] -> Facility -> Priority -> IO SyslogHandler
Files
- hslogger.cabal +1/−1
- src/System/Log/Handler/Syslog.hs +36/−10
hslogger.cabal view
@@ -1,5 +1,5 @@ Name: hslogger-Version: 1.2.1+Version: 1.2.2 License: BSD3 Maintainer: John Goerzen <jgoerzen@complete.org> Author: John Goerzen
src/System/Log/Handler/Syslog.hs view
@@ -42,11 +42,12 @@ Option(..) ) where +import qualified Control.Exception as E import System.Log import System.Log.Formatter import System.Log.Handler import Data.Bits-import Network.Socket+import Network.Socket as S import Network.BSD import Data.List #ifndef mingw32_HOST_OS@@ -131,6 +132,7 @@ identity :: String, logsocket :: Socket, address :: SockAddr,+ sock_type :: SocketType, priority :: Priority, formatter :: LogFormatter SyslogHandler }@@ -171,9 +173,29 @@ -> Priority -- ^ Priority limit -> IO SyslogHandler openlog_local fifopath ident options fac pri =- do- s <- socket AF_UNIX Datagram 0- openlog_generic s (SockAddrUnix fifopath) ident options fac pri+ do (s, t) <- do -- "/dev/log" is usually Datagram,+ -- but most of syslog loggers allow it to be+ -- of Stream type. glibc's" openlog()"+ -- does roughly the similar thing:+ -- http://www.gnu.org/software/libc/manual/html_node/openlog.html++ s <- socket AF_UNIX Stream 0+ tryStream s `E.catch` (onIOException (fallbackToDgram s))+ openlog_generic s (SockAddrUnix fifopath) t ident options fac pri++ where onIOException :: IO a -> E.IOException -> IO a+ onIOException a _ = a++ tryStream :: Socket -> IO (Socket, SocketType)+ tryStream s =+ do connect s (SockAddrUnix fifopath)+ return (s, Stream)++ fallbackToDgram :: Socket -> IO (Socket, SocketType)+ fallbackToDgram s =+ do S.close s -- close Stream variant+ d <- socket AF_UNIX Datagram 0+ return (d, Datagram) #endif {- | Log to a remote server via UDP. -}@@ -190,23 +212,25 @@ he <- getHostByName hostname s <- socket fam Datagram 0 let addr = SockAddrInet port (head (hostAddresses he))- openlog_generic s addr ident options fac pri- + openlog_generic s addr Datagram ident options fac pri+ {- | The most powerful initialization mechanism. Takes an open datagram socket. -} openlog_generic :: Socket -- ^ A datagram socket -> SockAddr -- ^ Address for transmissions+ -> SocketType -- ^ socket connection mode (stream / datagram) -> String -- ^ Program name -> [Option] -- ^ 'Option's -> Facility -- ^ Facility value -> Priority -- ^ Priority limit -> IO SyslogHandler-openlog_generic sock addr ident opt fac pri =+openlog_generic sock addr sock_t ident opt fac pri = return (SyslogHandler {options = opt, facility = fac, identity = ident, logsocket = sock, address = addr,+ sock_type = sock_t, priority = pri, formatter = syslogFormatter })@@ -234,12 +258,14 @@ getLevel sh = priority sh setFormatter sh f = sh{formatter = f} getFormatter sh = formatter sh- emit sh (_, msg) _ = - let + emit sh (_, msg) _ =+ let sendstr :: String -> IO String sendstr [] = return [] sendstr omsg = do- sent <- sendTo (logsocket sh) omsg (address sh)+ sent <- case sock_type sh of+ Datagram -> sendTo (logsocket sh) omsg (address sh)+ Stream -> send (logsocket sh) omsg sendstr (genericDrop sent omsg) in do if (elem PERROR (options sh))