, _graylogHost
, _graylogPort
, _graylogAddress
+ , _graylogSocket
+ , _graylogHostName
+ , ChunkSize
+ , defaultChunkSize
, openGraylog
, closeGraylog
) where
import Network.BSD
import Network.Socket
+type ChunkSize = Word
+
data Graylog
= Graylog
- { _graylogHost :: String
- , _graylogPort :: String
- , _graylogAddress :: AddrInfo
- , _graylogSocket :: Socket
- , _graylogHostName :: Text
+ { _graylogHost :: String
+ , _graylogPort :: String
+ , _graylogAddress :: AddrInfo
+ , _graylogSocket :: Socket
+ , _graylogHostName :: Text
+ , _graylogChunkSize :: ChunkSize
}
-openGraylog :: HostName -> ServiceName -> IO (Either String Graylog)
-openGraylog host port = do
+defaultChunkSize :: ChunkSize
+defaultChunkSize = 8192
+
+openGraylog :: HostName -> ServiceName -> ChunkSize -> IO (Either String Graylog)
+openGraylog host port chksize = do
infos <- getAddrInfo Nothing (Just host) (Just port)
case infos of
[] -> return $ Left "No address info found."
sock <- socket (addrFamily info) Datagram defaultProtocol
connect sock (addrAddress info)
hostname <- getHostName
- return $ Right $ Graylog host port info sock (T.pack hostname)
+ return $ Right $ Graylog host port info sock (T.pack hostname) chksize
_ -> return $ Left "Too many address infos found."
closeGraylog :: Graylog -> IO ()
module Graylog.UDP
- ( Graylog (..)
- , sendLog
+ ( sendLog
, module Export
) where
-import Graylog.Gelf as Export
-import Graylog.Types as Export
+import Data.Aeson
+import qualified Data.ByteString.Lazy as LBS
+import Network.Socket.ByteString.Lazy
+import System.Random.MWC
+
+import Graylog.Gelf as Export
+import Graylog.Types as Export
sendLog :: Graylog -> GELF -> IO ()
-sendLog glog msg = undefined
+sendLog glog msg = mapM_ (send $ _graylogSocket glog) cks
+ where
+ raw = encode msg
+ cks = chunky raw
+chunky :: LBS.ByteString -> [LBS.ByteString]
+chunky = undefined