Skip to content

Commit

Permalink
Some (limited) manual help against CLJ-865 [#132]
Browse files Browse the repository at this point in the history
This is a bit of a pita (and still doesn't solve issues when user
adds logging calls w/in her own macros); but it's better than nothing
while we wait on some kind of resolution to CLJ-865.
  • Loading branch information
ptaoussanis committed Feb 26, 2016
1 parent a3d52f5 commit 36785d6
Showing 1 changed file with 64 additions and 47 deletions.
111 changes: 64 additions & 47 deletions src/taoensso/timbre.cljx
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
:level ; Keyword
:error-level? ; Is level e/o #{:error :fatal}?
:?ns-str ; String, or nil
:?file ; String, or nil ; Waiting on CLJ-865
:?file ; String, or nil
:?line ; Integer, or nil ; Waiting on CLJ-865
:?err_ ; Delay - first-arg platform error, or nil
Expand Down Expand Up @@ -480,6 +480,8 @@

(comment (-with-elision :info "ns" (println "foo")))

(defn- fline [and-form] (:line (meta and-form)))

(defmacro log! ; Public wrapper around `-log!`
"Core low-level log macro. Useful for tooling, etc.
Expand All @@ -499,9 +501,12 @@
(let [{:keys [config ?err ?file ?line ?base-data]
:or {config 'taoensso.timbre/*config*
?err :auto ; => Extract as err-type a0
?file (let [f *file*] (when (not= f "NO_SOURCE_PATH") f))
;; TODO Waiting on http://dev.clojure.org/jira/browse/CLJ-865:
?line (:line (meta &form))}} opts]
?file *file*
;; NB waiting on CLJ-865:
?line (fline &form)}} opts

?file (when (not= ?file "NO_SOURCE_PATH") ?file)]

`(-log! ~config ~level ~?ns-str ~?file ~?line ~msg-type ~?err
(delay [~@args]) ~?base-data)))))

Expand All @@ -511,45 +516,55 @@
(macroexpand '(log! :info :p ["foo"] {:?line 42})))

;;;; Main public API-level stuff
;; TODO Have a bunch of cruft here trying to work around CLJ-865 to some extent

;;; Log using print-style args
(defmacro log* [config level & args] `(log! ~level :p ~args {:config ~config}))
(defmacro log [level & args] `(log! ~level :p ~args))
(defmacro trace [& args] `(log! :trace :p ~args))
(defmacro debug [& args] `(log! :debug :p ~args))
(defmacro info [& args] `(log! :info :p ~args))
(defmacro warn [& args] `(log! :warn :p ~args))
(defmacro error [& args] `(log! :error :p ~args))
(defmacro fatal [& args] `(log! :fatal :p ~args))
(defmacro report [& args] `(log! :report :p ~args))
(defmacro log* [config level & args] `(log! ~level :p ~args ~{:?line (fline &form) :config config}))
(defmacro log [level & args] `(log! ~level :p ~args ~{:?line (fline &form)}))
(defmacro trace [& args] `(log! :trace :p ~args ~{:?line (fline &form)}))
(defmacro debug [& args] `(log! :debug :p ~args ~{:?line (fline &form)}))
(defmacro info [& args] `(log! :info :p ~args ~{:?line (fline &form)}))
(defmacro warn [& args] `(log! :warn :p ~args ~{:?line (fline &form)}))
(defmacro error [& args] `(log! :error :p ~args ~{:?line (fline &form)}))
(defmacro fatal [& args] `(log! :fatal :p ~args ~{:?line (fline &form)}))
(defmacro report [& args] `(log! :report :p ~args ~{:?line (fline &form)}))

;;; Log using format-style args
(defmacro logf* [config level & args] `(log! ~level :f ~args {:config ~config}))
(defmacro logf [level & args] `(log! ~level :f ~args))
(defmacro tracef [& args] `(log! :trace :f ~args))
(defmacro debugf [& args] `(log! :debug :f ~args))
(defmacro infof [& args] `(log! :info :f ~args))
(defmacro warnf [& args] `(log! :warn :f ~args))
(defmacro errorf [& args] `(log! :error :f ~args))
(defmacro fatalf [& args] `(log! :fatal :f ~args))
(defmacro reportf [& args] `(log! :report :f ~args))
(defmacro logf* [config level & args] `(log! ~level :f ~args ~{:?line (fline &form) :config config}))
(defmacro logf [level & args] `(log! ~level :f ~args ~{:?line (fline &form)}))
(defmacro tracef [& args] `(log! :trace :f ~args ~{:?line (fline &form)}))
(defmacro debugf [& args] `(log! :debug :f ~args ~{:?line (fline &form)}))
(defmacro infof [& args] `(log! :info :f ~args ~{:?line (fline &form)}))
(defmacro warnf [& args] `(log! :warn :f ~args ~{:?line (fline &form)}))
(defmacro errorf [& args] `(log! :error :f ~args ~{:?line (fline &form)}))
(defmacro fatalf [& args] `(log! :fatal :f ~args ~{:?line (fline &form)}))
(defmacro reportf [& args] `(log! :report :f ~args ~{:?line (fline &form)}))

(comment
(infof "hello %s" "world")
(infof (Exception.) "hello %s" "world")
(infof (Exception.)))

(defmacro log-errors [& body]
(defmacro -log-errors [?line & body]
`(let [[?result# ?error#] (enc/catch-errors ~@body)]
(when-let [e# ?error#] (error e#))
(when-let [e# ?error#]
;; (error e#) ; CLJ-865
(log! :error :p [e#] ~{:?line ?line}))
?result#))

(defmacro log-and-rethrow-errors [& body]
(defmacro -log-and-rethrow-errors [?line & body]
`(let [[?result# ?error#] (enc/catch-errors ~@body)]
(when-let [e# ?error#] (error e#) (throw e#))
(when-let [e# ?error#]
;; (error e#) ; CLJ-865
(log! :error :p [e#] ~{:?line ?line})
(throw e#))
?result#))

(defmacro logged-future [& body] `(future (log-errors ~@body)))
(defmacro -logged-future [?line & body] `(future (-log-errors ~?line ~@body)))

(defmacro log-errors [& body] `(-log-errors ~(fline &form) ~@body))
(defmacro log-and-rethrow-errors [& body] `(-log-and-rethrow-errors ~(fline &form) ~@body))
(defmacro logged-future [& body] `(-logged-future ~(fline &form) ~@body))

#+clj
(defn handle-uncaught-jvm-exceptions!
Expand All @@ -571,29 +586,26 @@
(logged-future (/ 0))
(handle-uncaught-jvm-exceptions!))

(defmacro -spy [?line config level name expr]
`(-log-and-rethrow-errors ~?line
(let [result# ~expr]
;; Subject to elision:
;; (log* ~config ~level ~name "=>" result#) ; CLJ-865
(log! ~level :p [~name "=>" result#] ~{:?line ?line :config config})

;; NOT subject to elision:
result#)))

(defmacro spy
"Evaluates named expression and logs its result. Always returns the result.
Defaults to :debug logging level and unevaluated expression as name."
([ expr] `(spy :debug ~expr))
([ level expr] `(spy ~level '~expr ~expr))
([ level name expr] `(spy *config* ~level ~name ~expr))
([config level name expr]
`(log-and-rethrow-errors
(let [result# ~expr]
(log* ~config ~level ~name "=>" result#) ; Subject to elision
result# ; NOT subject to elision
))))
([ expr] `(-spy ~(fline &form) *config* :debug '~expr ~expr))
([ level expr] `(-spy ~(fline &form) *config* ~level '~expr ~expr))
([ level name expr] `(-spy ~(fline &form) *config* ~level ~name ~expr))
([config level name expr] `(-spy ~(fline &form) ~config ~level ~name ~expr)))

(defmacro get-env [] `(enc/get-env))
(defmacro log-env
"Logs named &env value.
Defaults to :debug logging level and \"&env\" as name."
([ ] `(log-env :debug))
([ level ] `(log-env ~level "&env"))
([ level name] `(log-env *config* ~level ~name))
([config level name] `(log* ~config ~level ~name "=>" (get-env))))

(comment ((fn foo [x y] (log-env) (+ x y)) 5 10))
(comment ((fn foo [x y] (get-env)) 5 10))

#+clj
(defn refer-timbre
Expand Down Expand Up @@ -666,8 +678,13 @@

;;;; Deprecated

(defn str-println [& xs] (str-join xs))
(defn logging-enabled? [level compile-time-ns] (log? level (str compile-time-ns)))
(defn str-println [& xs] (str-join xs))
(defmacro with-log-level [level & body] `(with-level ~level ~@body))
(defmacro with-logging-config [config & body] `(with-config ~config ~@body))
(defn logging-enabled? [level compile-time-ns] (log? level (str compile-time-ns)))
(defmacro logp [& sigs] `(log ~@sigs))
(defmacro log-env
([ ] `(log-env :debug))
([ level ] `(log-env ~level "&env"))
([ level name] `(log-env *config* ~level ~name))
([config level name] `(log* ~config ~level ~name "=>" (get-env))))

This comment has been minimized.

Copy link
@visibletrap

visibletrap Oct 27, 2016

I skimmed through #132 but not quite follow why log-env is deprecated here. Could you explain a little bit? Also should we remove it from README?

This comment has been minimized.

Copy link
@ptaoussanis

ptaoussanis Oct 27, 2016

Author Member

Hi Nuttanart,

Just deprecated since it's not very useful to have a dedicated macro just for this. You can use (timbre/get-env) directly in any of your normal logging calls without needing log-env.

Does that help / make sense?

This comment has been minimized.

Copy link
@visibletrap

visibletrap Oct 27, 2016

That makes a perfect sense. Thank you.

0 comments on commit 36785d6

Please sign in to comment.