Skip to content

Instantly share code, notes, and snippets.

@hiredman
Created December 15, 2020 23:17
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hiredman/64bc7ee3e89dbdb3bb2d92c6bddf1ff6 to your computer and use it in GitHub Desktop.
Save hiredman/64bc7ee3e89dbdb3bb2d92c6bddf1ff6 to your computer and use it in GitHub Desktop.
(defonce ^Logger logger (doto (Logger/getLogger "clojure")
(.setUseParentHandlers false)
(.addHandler
(doto (ConsoleHandler.)
(.setLevel Level/ALL)
(.setFormatter
(proxy [SimpleFormatter] []
(format [^LogRecord record]
(let [sb (StringBuilder.)]
(.append sb "#:log{")
(.append sb ":z ")
(.append sb (pr-str (str (java.time.Instant/ofEpochMilli (.getMillis record)))))
;; (.append sb " :b ")
;; (.append sb (format "%02d" (.getSequenceNumber record)))
;; (.append sb " :c ")
;; (.append sb (format "%02d" (.getThreadID record)))
(.append sb " :v :")
(.append sb (.toLowerCase (.getName (.getLevel record))))
(.append sb " :n ")
(.append sb (.getSourceClassName record))
(.append sb " :l ")
(.append sb (.getSourceMethodName record))
(.append sb " :m ")
(.append sb (pr-str (.getMessage record)))
(doseq [p (seq (.getParameters record))
:when (map? p)
[k v] (seq p)]
(doto sb
(.append " ")
(cond->
(namespace k) (.append (pr-str k))
(not (namespace k)) (-> (.append ":_/") (.append (name k))))
(.append " ")
(.append (pr-str v))))
(when-let [t (.getThrown record)]
(.append sb " :thrown \n")
(.append sb (pr-str t)))
(.append sb "}\n")
(str sb)))))))))
(doseq [level '[severe warning info config fine finer finest]]
(intern *ns*
level
(fn
([&form &env msg]
(let [ns (name (ns-name *ns*))]
`(.logp logger ~(symbol "Level" (.toUpperCase (name level))) ~ns ~(str (:line (meta &form))) (print-str ~msg))))
([&form &env msg parameters]
(let [ns (name (ns-name *ns*))]
`(let [p# ~parameters]
(if (map? p#)
(.logp logger
~(symbol "Level" (.toUpperCase (name level)))
~ns
~(str (:line (meta &form)))
(print-str ~msg)
p#)
(.logp logger
~(symbol "Level" (.toUpperCase (name level)))
~ns
~(str (:line (meta &form)))
(print-str ~msg)
^Throwable p#)))))))
(.setMacro ^clojure.lang.Var (ns-resolve *ns* level)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment