0 | ||| Structured message types for application logging.
 1 | module Log4Types.Message
 2 |
 3 | import Log4Types.Core
 4 | import Log4Types.Format
 5 |
 6 | %default total
 7 |
 8 | ----------------------------------------------------------------------
 9 | -- SimpleMsg
10 | ----------------------------------------------------------------------
11 |
12 | ||| A simple log message with severity and text, no structured fields.
13 | public export
14 | record SimpleMsg where
15 |   constructor MkSimpleMsg
16 |   severity : Severity
17 |   text     : String
18 |
19 | public export
20 | Show SimpleMsg where
21 |   show msg = fmtSeverity msg.severity ++ " " ++ msg.text
22 |
23 | public export
24 | Loggable SimpleMsg where
25 |   logFields renderer msg acc =
26 |     renderer.addField "severity" (StrVal $ show msg.severity) $
27 |     renderer.addField "message" (StrVal msg.text) acc
28 |   logShow = show
29 |
30 | ----------------------------------------------------------------------
31 | -- Msg
32 | ----------------------------------------------------------------------
33 |
34 | ||| A structured log message with severity, text, and key-value fields.
35 | public export
36 | record Msg where
37 |   constructor MkMsg
38 |   severity : Severity
39 |   text     : String
40 |   fields   : List (String, LogParamValue)
41 |
42 | public export
43 | Show Msg where
44 |   show msg =
45 |     let base = fmtSeverity msg.severity ++ " " ++ msg.text
46 |         flds = concatMap (\(k, v) => " " ++ k ++ "=" ++ show v) msg.fields
47 |     in base ++ flds
48 |
49 | public export
50 | Loggable Msg where
51 |   logFields renderer msg acc =
52 |     let acc' = renderer.addField "severity" (StrVal $ show msg.severity) $
53 |                renderer.addField "message" (StrVal msg.text) acc
54 |     in foldl (\a, (k, v) => renderer.addField k v a) acc' msg.fields
55 |   logShow = show
56 |
57 | ----------------------------------------------------------------------
58 | -- Convenience constructors
59 | ----------------------------------------------------------------------
60 |
61 | ||| Create a Debug message with no structured fields.
62 | public export
63 | mkDebug : String -> Msg
64 | mkDebug t = MkMsg Debug t []
65 |
66 | ||| Create an Info message with no structured fields.
67 | public export
68 | mkInfo : String -> Msg
69 | mkInfo t = MkMsg Info t []
70 |
71 | ||| Create a Warning message with no structured fields.
72 | public export
73 | mkWarning : String -> Msg
74 | mkWarning t = MkMsg Warning t []
75 |
76 | ||| Create an Error message with no structured fields.
77 | public export
78 | mkError : String -> Msg
79 | mkError t = MkMsg Error t []
80 |