]> git.immae.eu Git - github/fretlink/haskell-graylog.git/blame - src/Graylog/Gelf.hs
Merge pull request #2 from adfretlink/bump-lts
[github/fretlink/haskell-graylog.git] / src / Graylog / Gelf.hs
CommitLineData
52696643
A
1{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveGeneric #-}
3{-# LANGUAGE OverloadedStrings #-}
8c9d965d 4{-# LANGUAGE RecordWildCards #-}
52696643 5
d9a5d441
A
6-- | Default formatting for Graylog messages,
7-- see http://docs.graylog.org/en/latest/pages/gelf.html
52696643
A
8module Graylog.Gelf where
9
4b663780
TC
10import Data.Aeson (ToJSON (..), Value (..), object, toJSON,
11 (.=))
8c9d965d 12import Data.HashMap.Strict (HashMap)
4b663780 13import Data.Scientific (Scientific)
8c9d965d 14import Data.Text (Text)
52696643
A
15import Data.Time
16import Data.Typeable
8c9d965d 17import GHC.Exts (toList)
52696643
A
18import GHC.Generics
19
20data GELF
21 = GELF
15981d57
A
22 { _gelfVersion :: Version
23 , _gelfHost :: Text
24 , _gelfShortMessage :: Text
25 , _gelfFullMessage :: Maybe Text
26 , _gelfTimestamp :: Maybe UTCTime
27 , _gelfLevel :: Maybe SyslogLevel
28 , _gelfLine :: Maybe Word
29 , _gelfFile :: Maybe Text
4b663780 30 , _gelfMeta :: HashMap Text MetaValue
52696643
A
31 }
32 deriving (Show, Typeable, Generic)
33
4b663780
TC
34data MetaValue
35 = TextValue Text
36 | NumberValue Scientific
37 deriving (Show)
38
39instance ToJSON MetaValue where
40 toJSON (TextValue txt) = toJSON txt
41 toJSON (NumberValue n) = toJSON n
42
43class ToMeta a where
44 toMeta :: a -> MetaValue
45
46instance ToMeta Text where
47 toMeta = TextValue
48
49instance ToMeta Scientific where
50 toMeta = NumberValue
51
52instance ToMeta Integer where
53 toMeta = NumberValue . fromInteger
54
55instance ToMeta Int where
56 toMeta = toMeta . toInteger
57
52696643 58instance ToJSON GELF where
8c9d965d
TC
59 toJSON GELF{..} = object $ [ "version" .= _gelfVersion
60 , "host" .= _gelfHost
61 , "short_message" .= _gelfShortMessage
62 , "full_message" .= _gelfFullMessage
63 , "timestamp" .= _gelfTimestamp
64 , "level" .= _gelfLevel
65 , "line" .= _gelfLine
66 , "file" .= _gelfFile
4b663780 67 ] <> toList (toJSON <$> _gelfMeta)
52696643
A
68
69--
70
71data Version
72 = Version1x1
73 deriving (Eq, Show, Typeable, Generic)
74
75instance ToJSON Version where
76 toJSON Version1x1 = String "1.1"
77
78--
79
80data SyslogLevel
81 = Emergency
82 | Alert
83 | Critical
84 | Error
85 | Warning
86 | Notice
87 | Informational
88 | Debug
89 deriving (Eq, Ord, Show, Typeable, Generic)
90
91instance ToJSON SyslogLevel where
92 toJSON Emergency = Number 0
93 toJSON Alert = Number 1
94 toJSON Critical = Number 2
95 toJSON Error = Number 3
96 toJSON Warning = Number 4
97 toJSON Notice = Number 5
98 toJSON Informational = Number 6
99 toJSON Debug = Number 7
b23afe7b
A
100
101--
102
103simpleGelf
104 :: Text -- ^ Hostname
105 -> Text -- ^ Short message
106 -> GELF
107simpleGelf host short =
8c9d965d 108 GELF Version1x1 host short Nothing Nothing Nothing Nothing Nothing mempty