mirror of
https://github.com/penpot/penpot.git
synced 2025-06-07 08:51:41 +02:00
♻️ Refactor logging.
This commit is contained in:
parent
44d64e4831
commit
e12a6e65a6
33 changed files with 383 additions and 193 deletions
111
backend/src/app/util/logging.clj
Normal file
111
backend/src/app/util/logging.clj
Normal file
|
@ -0,0 +1,111 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
;;
|
||||
;; This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
;; defined by the Mozilla Public License, v. 2.0.
|
||||
;;
|
||||
;; Copyright (c) UXBOX Labs SL
|
||||
|
||||
(ns app.util.logging
|
||||
(:require
|
||||
[linked.core :as lk]
|
||||
[clojure.pprint :refer [pprint]])
|
||||
(:import
|
||||
java.util.Map
|
||||
org.apache.logging.log4j.Level
|
||||
org.apache.logging.log4j.LogManager
|
||||
org.apache.logging.log4j.Logger
|
||||
org.apache.logging.log4j.ThreadContext
|
||||
org.apache.logging.log4j.message.MapMessage
|
||||
org.apache.logging.log4j.spi.LoggerContext))
|
||||
|
||||
(defn build-map-message
|
||||
[m]
|
||||
(let [message (MapMessage. (count m))]
|
||||
(reduce-kv #(.with ^MapMessage %1 (name %2) %3) message m)))
|
||||
|
||||
(defprotocol ILogger
|
||||
(-enabled? [logger level])
|
||||
(-write! [logger level throwable message]))
|
||||
|
||||
(def logger-context
|
||||
(LogManager/getContext false))
|
||||
|
||||
(def logging-agent
|
||||
(agent nil :error-mode :continue))
|
||||
|
||||
(defn get-logger
|
||||
[lname]
|
||||
(.getLogger ^LoggerContext logger-context ^String lname))
|
||||
|
||||
(defn get-level
|
||||
[level]
|
||||
(case level
|
||||
:trace Level/TRACE
|
||||
:debug Level/DEBUG
|
||||
:info Level/INFO
|
||||
:warn Level/WARN
|
||||
:error Level/ERROR
|
||||
:fatal Level/FATAL))
|
||||
|
||||
(defn enabled?
|
||||
[logger level]
|
||||
(.isEnabled ^Logger logger ^Level level))
|
||||
|
||||
(defn write-log!
|
||||
[logger level e msg]
|
||||
(if e
|
||||
(.log ^Logger logger
|
||||
^Level level
|
||||
^Object msg
|
||||
^Throwable e)
|
||||
(.log ^Logger logger
|
||||
^Level level
|
||||
^Object msg)))
|
||||
|
||||
(defmacro log
|
||||
[& {:keys [level cause msg ::logger ::async] :as props}]
|
||||
(let [props (dissoc props :level :cause ::logger ::async)
|
||||
logger (or logger (str *ns*))
|
||||
logger-sym (gensym "log")
|
||||
level-sym (gensym "log")]
|
||||
`(let [~logger-sym (get-logger ~logger)
|
||||
~level-sym (get-level ~level)]
|
||||
(if (enabled? ~logger-sym ~level-sym)
|
||||
~(if async
|
||||
`(send-off logging-agent (fn [_#] (write-log! ~logger-sym ~level-sym ~cause (build-map-message ~props))))
|
||||
`(write-log! ~logger-sym ~level-sym ~cause (build-map-message ~props)))))))
|
||||
|
||||
(defmacro info
|
||||
[& params]
|
||||
`(log :level :info ~@params))
|
||||
|
||||
(defmacro error
|
||||
[& params]
|
||||
`(log :level :error ~@params))
|
||||
|
||||
(defmacro warn
|
||||
[& params]
|
||||
`(log :level :warn ~@params))
|
||||
|
||||
(defmacro debug
|
||||
[& params]
|
||||
`(log :level :debug ~@params))
|
||||
|
||||
(defmacro trace
|
||||
[& params]
|
||||
`(log :level :trace ~@params))
|
||||
|
||||
(defn update-thread-context!
|
||||
[data]
|
||||
(run! (fn [[key val]]
|
||||
(ThreadContext/put
|
||||
(name key)
|
||||
(cond
|
||||
(coll? val)
|
||||
(binding [clojure.pprint/*print-right-margin* 120]
|
||||
(with-out-str (pprint val)))
|
||||
(instance? clojure.lang.Named val) (name val)
|
||||
:else (str val))))
|
||||
data))
|
Loading…
Add table
Add a link
Reference in a new issue