/
logger.clj
32 lines (27 loc) · 1.07 KB
/
logger.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(ns duct.logger
"Protocol and macro for logging events in Duct.")
(defprotocol Logger
"Protocol for abstracting logging. Used by the log macro."
(-log [logger level ns-str file line id event data]))
(extend-protocol Logger
nil
(-log [_ _ _ _ _ _ _ _]))
(defn- log-form [logger level event data form]
`(-log ~logger
~level
~(str *ns*) ~*file* ~(:line (meta form))
(delay (java.util.UUID/randomUUID))
~event ~data))
(defmacro log
"Log an event and optional data structure at the supplied severity level
using a logger that implements the Logger protocol."
([logger level event] (log-form logger level event nil &form))
([logger level event data] (log-form logger level event data &form)))
(doseq [level '(report fatal error warn info debug)]
(eval
`(defmacro ~level
~(format "Log an event with %s logging level. See [[log]]." level)
(~'[logger event]
(log-form ~'logger ~(keyword level) ~'event nil ~'&form))
(~'[logger event data]
(log-form ~'logger ~(keyword level) ~'event ~'data ~'&form)))))