-
-
Notifications
You must be signed in to change notification settings - Fork 171
/
congomongo.clj
55 lines (48 loc) · 1.68 KB
/
congomongo.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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(ns taoensso.timbre.appenders.community.congomongo
"MongoDB appender.
Requires <https://github.com/congomongo/congomongo>."
{:author "Emlyn Corrin (@emlyn)"}
(:require [somnium.congomongo :as mongo]
[taoensso.timbre :as timbre]
[taoensso.encore :as encore]))
;; TODO Test port to Timbre v4
(defn- connect [{:keys [db server write-concern]}]
(let [args (merge {:host "127.0.0.1" :port 27017} server)
c (mongo/make-connection db args)]
(when write-concern
(mongo/set-write-concern c write-concern))
c))
(def ^:private conn_ (atom nil))
(defn- ensure-conn [config] (swap! conn_ #(or % (connect config))))
(defn- default-entry-fn [data]
(let [{:keys [instant level hostname_
context ?err ?ns-str ?file ?line msg_]} data]
{:instant instant
:level level
:hostname (force hostname_)
:context context
:?err (when-let [err ?err] (str err))
:?ns-str ?ns-str
:?file ?file
:?line ?line
:msg (force msg_)}))
(defn- log-message [config collection entry-fn data]
(let [entry (entry-fn data)]
(mongo/with-mongo (ensure-conn config)
(mongo/insert! collection entry))))
(defn congomongo-appender
"Returns a congomongo MongoDB appender.
(congomongo-appender
{:db \"logs\"
:collection \"myapp\"
:write-concern :acknowledged
:server {:host \"127.0.0.1\"
:port 27017}})"
[config]
(let [{:keys [collection entry-fn]
:or {entry-fn default-entry-fn}} config]
{:enabled? true
:async? true
:min-level :warn
:rate-limit [[1 1000]] ; 1/sec
:fn (fn [data] (log-message config collection entry-fn data))}))