mirror of
https://github.com/status-im/timbre.git
synced 2025-02-18 06:36:23 +00:00
Housekeeping
This commit is contained in:
parent
7c29ce6852
commit
c30ae5fbcc
@ -86,7 +86,7 @@ Configuring Timbre couldn't be simpler. Let's check out (some of) the defaults:
|
|||||||
:ns-whitelist []
|
:ns-whitelist []
|
||||||
:ns-blacklist []
|
:ns-blacklist []
|
||||||
|
|
||||||
:middleware [] ; As of 1.4.0, see source code
|
:middleware [] ; As of 1.4.0, see source for details
|
||||||
|
|
||||||
:timestamp-pattern "yyyy-MMM-dd HH:mm:ss ZZ"
|
:timestamp-pattern "yyyy-MMM-dd HH:mm:ss ZZ"
|
||||||
:timestamp-locale nil
|
:timestamp-locale nil
|
||||||
|
@ -16,12 +16,12 @@
|
|||||||
(print (str (str/join \space xs) \newline))
|
(print (str (str/join \space xs) \newline))
|
||||||
(flush))
|
(flush))
|
||||||
|
|
||||||
(defn color-str [color-key & xs]
|
(defn color-str [color & xs]
|
||||||
(let [ansi-color #(str "\u001b[" (case % :reset "0" :black "30" :red "31"
|
(let [ansi-color #(str "\u001b[" (case % :reset "0" :black "30" :red "31"
|
||||||
:green "32" :yellow "33" :blue "34"
|
:green "32" :yellow "33" :blue "34"
|
||||||
:purple "35" :cyan "36" :white "37"
|
:purple "35" :cyan "36" :white "37"
|
||||||
"0") "m")]
|
"0") "m")]
|
||||||
(str (ansi-color color-key) (apply str xs) (ansi-color :reset))))
|
(str (ansi-color color) (apply str xs) (ansi-color :reset))))
|
||||||
|
|
||||||
(def red (partial color-str :red))
|
(def red (partial color-str :red))
|
||||||
(def green (partial color-str :green))
|
(def green (partial color-str :green))
|
||||||
@ -133,10 +133,10 @@
|
|||||||
"Wraps compile-time appender fn with additional runtime capabilities
|
"Wraps compile-time appender fn with additional runtime capabilities
|
||||||
controlled by compile-time config."
|
controlled by compile-time config."
|
||||||
[{apfn :fn :keys [async? max-message-per-msecs prefix-fn] :as appender}]
|
[{apfn :fn :keys [async? max-message-per-msecs prefix-fn] :as appender}]
|
||||||
(->> ; Wrapping applies capabilities bottom-to-top
|
(->> ; Wrapping applies per appender, bottom-to-top
|
||||||
apfn
|
apfn
|
||||||
|
|
||||||
;; Wrap for per-appender prefix-fn support
|
;; Prefix-fn support
|
||||||
((fn [apfn]
|
((fn [apfn]
|
||||||
(if-not prefix-fn
|
(if-not prefix-fn
|
||||||
apfn
|
apfn
|
||||||
@ -144,7 +144,7 @@
|
|||||||
(apfn (assoc apfn-args
|
(apfn (assoc apfn-args
|
||||||
:prefix (prefix-fn apfn-args)))))))
|
:prefix (prefix-fn apfn-args)))))))
|
||||||
|
|
||||||
;; Wrap for runtime flood-safety support
|
;; Rate limit support
|
||||||
((fn [apfn]
|
((fn [apfn]
|
||||||
(if-not max-message-per-msecs
|
(if-not max-message-per-msecs
|
||||||
apfn
|
apfn
|
||||||
@ -173,7 +173,7 @@
|
|||||||
(when (seq expired-timers)
|
(when (seq expired-timers)
|
||||||
(apply swap! flood-timers dissoc expired-timers))))))))))
|
(apply swap! flood-timers dissoc expired-timers))))))))))
|
||||||
|
|
||||||
;; Wrap for async (agent) support
|
;; Async (agent) support
|
||||||
((fn [apfn]
|
((fn [apfn]
|
||||||
(if-not async?
|
(if-not async?
|
||||||
apfn
|
apfn
|
||||||
@ -202,10 +202,10 @@
|
|||||||
(incl. middleware) controlled by compile-time config. Like `wrap-appender-fn`
|
(incl. middleware) controlled by compile-time config. Like `wrap-appender-fn`
|
||||||
but operates on the entire juxt at once."
|
but operates on the entire juxt at once."
|
||||||
[juxtfn]
|
[juxtfn]
|
||||||
(->> ; Wrapping applies capabilities bottom-to-top
|
(->> ; Wrapping applies per juxt, bottom-to-top
|
||||||
juxtfn
|
juxtfn
|
||||||
|
|
||||||
;; Wrap to add middleware transforms/filters
|
;; Middleware transforms/filters support
|
||||||
((fn [juxtfn]
|
((fn [juxtfn]
|
||||||
(if-let [middleware (seq (:middleware @config))]
|
(if-let [middleware (seq (:middleware @config))]
|
||||||
(let [composed-middleware
|
(let [composed-middleware
|
||||||
@ -216,7 +216,7 @@
|
|||||||
(juxtfn juxtfn-args))))
|
(juxtfn juxtfn-args))))
|
||||||
juxtfn)))
|
juxtfn)))
|
||||||
|
|
||||||
;; Wrap to add compile-time stuff to runtime appender arguments
|
;; Add compile-time stuff to runtime appender args
|
||||||
((fn [juxtfn]
|
((fn [juxtfn]
|
||||||
(let [{ap-config :shared-appender-config
|
(let [{ap-config :shared-appender-config
|
||||||
:keys [timestamp-pattern timestamp-locale prefix-fn]} @config
|
:keys [timestamp-pattern timestamp-locale prefix-fn]} @config
|
||||||
@ -233,14 +233,13 @@
|
|||||||
;;; Appender-fns
|
;;; Appender-fns
|
||||||
|
|
||||||
(def appenders-juxt-cache
|
(def appenders-juxt-cache
|
||||||
"Per-level, combined relevant appender-fns to allow for fast runtime
|
"Per-level, combined level-relevant appender-fns to allow for fast runtime
|
||||||
appender-fn dispatch:
|
appender-fn dispatch:
|
||||||
{:level (wrapped-juxt wrapped-appender-fn wrapped-appender-fn ...) or nil
|
{:level (wrapped-juxt wrapped-appender-fn wrapped-appender-fn ...) or nil
|
||||||
...}"
|
...}"
|
||||||
(atom {}))
|
(atom {}))
|
||||||
|
|
||||||
(defn- relevant-appenders
|
(defn- relevant-appenders [level]
|
||||||
[level]
|
|
||||||
(->> (:appenders @config)
|
(->> (:appenders @config)
|
||||||
(filter #(let [{:keys [enabled? min-level]} (val %)]
|
(filter #(let [{:keys [enabled? min-level]} (val %)]
|
||||||
(and enabled? (>= (compare-levels level min-level) 0))))
|
(and enabled? (>= (compare-levels level min-level) 0))))
|
||||||
@ -249,8 +248,7 @@
|
|||||||
(comment (relevant-appenders :debug)
|
(comment (relevant-appenders :debug)
|
||||||
(relevant-appenders :trace))
|
(relevant-appenders :trace))
|
||||||
|
|
||||||
(defn- cache-appenders-juxt!
|
(defn- cache-appenders-juxt! []
|
||||||
[]
|
|
||||||
(->>
|
(->>
|
||||||
(zipmap
|
(zipmap
|
||||||
ordered-levels
|
ordered-levels
|
||||||
@ -269,13 +267,11 @@
|
|||||||
(def ns-filter-cache "@ns-filter-cache => (fn relevant-ns? [ns] ...)"
|
(def ns-filter-cache "@ns-filter-cache => (fn relevant-ns? [ns] ...)"
|
||||||
(atom (constantly true)))
|
(atom (constantly true)))
|
||||||
|
|
||||||
(defn- ns-match?
|
(defn- ns-match? [ns match]
|
||||||
[ns match]
|
|
||||||
(-> (str "^" (-> (str match) (.replace "." "\\.") (.replace "*" "(.*)")) "$")
|
(-> (str "^" (-> (str match) (.replace "." "\\.") (.replace "*" "(.*)")) "$")
|
||||||
re-pattern (re-find (str ns)) boolean))
|
re-pattern (re-find (str ns)) boolean))
|
||||||
|
|
||||||
(defn- cache-ns-filter!
|
(defn- cache-ns-filter! []
|
||||||
[]
|
|
||||||
(->>
|
(->>
|
||||||
(let [{:keys [ns-whitelist ns-blacklist]} @config]
|
(let [{:keys [ns-whitelist ns-blacklist]} @config]
|
||||||
(memoize
|
(memoize
|
||||||
@ -304,11 +300,10 @@
|
|||||||
(defn logging-enabled?
|
(defn logging-enabled?
|
||||||
"Returns true when current logging level is sufficient and current namespace
|
"Returns true when current logging level is sufficient and current namespace
|
||||||
is unfiltered."
|
is unfiltered."
|
||||||
[level]
|
[level] (and (sufficient-level? level) (@ns-filter-cache *ns*)))
|
||||||
(and (sufficient-level? level) (@ns-filter-cache *ns*)))
|
|
||||||
|
|
||||||
(defmacro log*
|
(defmacro log*
|
||||||
"Prepares given arguments for, and then dispatches to all relevant
|
"Prepares given arguments for, and then dispatches to all level-relevant
|
||||||
appender-fns."
|
appender-fns."
|
||||||
[level base-args & sigs]
|
[level base-args & sigs]
|
||||||
`(when-let [juxt-fn# (@appenders-juxt-cache ~level)] ; Any relevant appenders?
|
`(when-let [juxt-fn# (@appenders-juxt-cache ~level)] ; Any relevant appenders?
|
||||||
@ -333,7 +328,7 @@
|
|||||||
nil)))
|
nil)))
|
||||||
|
|
||||||
(defmacro log
|
(defmacro log
|
||||||
"When logging is enabled, actually logs given arguments with relevant
|
"When logging is enabled, actually logs given arguments with level-relevant
|
||||||
appender-fns. Generic form of standard level-loggers (trace, info, etc.)."
|
appender-fns. Generic form of standard level-loggers (trace, info, etc.)."
|
||||||
{:arglists '([level message & more] [level throwable message & more])}
|
{:arglists '([level message & more] [level throwable message & more])}
|
||||||
[level & sigs]
|
[level & sigs]
|
||||||
@ -356,8 +351,7 @@
|
|||||||
{:arglists '([expr] [level expr] [level name expr])}
|
{:arglists '([expr] [level expr] [level name expr])}
|
||||||
[& args] `(spy ~@args))
|
[& args] `(spy ~@args))
|
||||||
|
|
||||||
(defmacro ^:private def-logger
|
(defmacro ^:private def-logger [level]
|
||||||
[level]
|
|
||||||
(let [level-name (name level)]
|
(let [level-name (name level)]
|
||||||
`(defmacro ~(symbol level-name)
|
`(defmacro ~(symbol level-name)
|
||||||
~(str "Log given arguments at " (str/capitalize level-name) " level.")
|
~(str "Log given arguments at " (str/capitalize level-name) " level.")
|
||||||
@ -370,13 +364,14 @@
|
|||||||
|
|
||||||
(def-loggers) ; Actually define a logger for each logging level
|
(def-loggers) ; Actually define a logger for each logging level
|
||||||
|
|
||||||
(defmacro log-errors
|
(defmacro log-errors [& body]
|
||||||
[& body] `(try ~@body (catch Exception e# (error e#))))
|
`(try ~@body (catch Exception e# (error e#))))
|
||||||
|
|
||||||
(defmacro log-and-rethrow-errors
|
(defmacro log-and-rethrow-errors [& body]
|
||||||
[& body] `(try ~@body (catch Exception e# (error e#) (throw e#))))
|
`(try ~@body (catch Exception e# (error e#) (throw e#))))
|
||||||
|
|
||||||
(defmacro logged-future [& body] `(future (log-errors ~@body)))
|
(defmacro logged-future [& body]
|
||||||
|
`(future (log-errors ~@body)))
|
||||||
|
|
||||||
(comment (log-errors (/ 0))
|
(comment (log-errors (/ 0))
|
||||||
(log-and-rethrow-errors (/ 0))
|
(log-and-rethrow-errors (/ 0))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user