diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn index 4085b6d50..d1e91f24b 100644 --- a/.clj-kondo/config.edn +++ b/.clj-kondo/config.edn @@ -17,6 +17,7 @@ {:exclude-files ["data_readers.clj" "app/util/perf.cljs" + "app/common/logging.cljc" "app/common/exceptions.cljc"]} :linters diff --git a/backend/src/app/cli/fixtures.clj b/backend/src/app/cli/fixtures.clj index cd09769cb..4128c9954 100644 --- a/backend/src/app/cli/fixtures.clj +++ b/backend/src/app/cli/fixtures.clj @@ -7,13 +7,13 @@ (ns app.cli.fixtures "A initial fixtures." (:require + [app.common.logging :as l] [app.common.pages :as cp] [app.common.uuid :as uuid] [app.db :as db] [app.main :as main] [app.rpc.mutations.profile :as profile] [app.util.blob :as blob] - [app.util.logging :as l] [buddy.hashers :as hashers] [integrant.core :as ig])) diff --git a/backend/src/app/cli/manage.clj b/backend/src/app/cli/manage.clj index 29975d0a9..d20758196 100644 --- a/backend/src/app/cli/manage.clj +++ b/backend/src/app/cli/manage.clj @@ -7,11 +7,11 @@ (ns app.cli.manage "A manage cli api." (:require + [app.common.logging :as l] [app.db :as db] [app.main :as main] [app.rpc.mutations.profile :as profile] [app.rpc.queries.profile :refer [retrieve-profile-data-by-email]] - [app.util.logging :as l] [clojure.string :as str] [clojure.tools.cli :refer [parse-opts]] [integrant.core :as ig]) diff --git a/backend/src/app/cli/migrate_media.clj b/backend/src/app/cli/migrate_media.clj index 0d627afdc..b940b1a33 100644 --- a/backend/src/app/cli/migrate_media.clj +++ b/backend/src/app/cli/migrate_media.clj @@ -6,12 +6,12 @@ (ns app.cli.migrate-media (:require + [app.common.logging :as l] [app.common.media :as cm] [app.config :as cf] [app.db :as db] [app.main :as main] [app.storage :as sto] - [app.util.logging :as l] [cuerdas.core :as str] [datoteka.core :as fs] [integrant.core :as ig])) diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj index 6f1b940af..7a86e0e87 100644 --- a/backend/src/app/db.clj +++ b/backend/src/app/db.clj @@ -9,13 +9,13 @@ [app.common.data :as d] [app.common.exceptions :as ex] [app.common.geom.point :as gpt] + [app.common.logging :as l] [app.common.spec :as us] [app.common.transit :as t] [app.common.uuid :as uuid] [app.db.sql :as sql] [app.metrics :as mtx] [app.util.json :as json] - [app.util.logging :as l] [app.util.migrations :as mg] [app.util.time :as dt] [clojure.java.io :as io] diff --git a/backend/src/app/emails.clj b/backend/src/app/emails.clj index 0487feaed..43b648274 100644 --- a/backend/src/app/emails.clj +++ b/backend/src/app/emails.clj @@ -7,12 +7,12 @@ (ns app.emails "Main api for send emails." (:require + [app.common.logging :as l] [app.common.spec :as us] [app.config :as cf] [app.db :as db] [app.db.sql :as sql] [app.util.emails :as emails] - [app.util.logging :as l] [app.worker :as wrk] [clojure.spec.alpha :as s] [integrant.core :as ig])) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 3681118ad..9ef7a8773 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -8,11 +8,11 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.http.errors :as errors] [app.http.middleware :as middleware] [app.metrics :as mtx] - [app.util.logging :as l] [clojure.spec.alpha :as s] [integrant.core :as ig] [reitit.ring :as rr] diff --git a/backend/src/app/http/awsns.clj b/backend/src/app/http/awsns.clj index d5c29a979..7117c6466 100644 --- a/backend/src/app/http/awsns.clj +++ b/backend/src/app/http/awsns.clj @@ -8,10 +8,10 @@ "AWS SNS webhook handler for bounces." (:require [app.common.exceptions :as ex] + [app.common.logging :as l] [app.db :as db] [app.db.sql :as sql] [app.util.http :as http] - [app.util.logging :as l] [clojure.spec.alpha :as s] [cuerdas.core :as str] [integrant.core :as ig] diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 54e9ece86..ab8f7e1d2 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -9,8 +9,8 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.uuid :as uuid] - [app.util.logging :as l] [clojure.pprint] [cuerdas.core :as str])) diff --git a/backend/src/app/http/middleware.clj b/backend/src/app/http/middleware.clj index c6ee09f2e..200718d30 100644 --- a/backend/src/app/http/middleware.clj +++ b/backend/src/app/http/middleware.clj @@ -6,10 +6,10 @@ (ns app.http.middleware (:require + [app.common.logging :as l] [app.common.transit :as t] [app.metrics :as mtx] [app.util.json :as json] - [app.util.logging :as l] [buddy.core.codecs :as bc] [buddy.core.hash :as bh] [clojure.java.io :as io] diff --git a/backend/src/app/http/oauth.clj b/backend/src/app/http/oauth.clj index 528d90427..a60be8490 100644 --- a/backend/src/app/http/oauth.clj +++ b/backend/src/app/http/oauth.clj @@ -8,6 +8,7 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.common.uri :as u] [app.config :as cf] @@ -15,7 +16,6 @@ [app.loggers.audit :as audit] [app.rpc.queries.profile :as profile] [app.util.http :as http] - [app.util.logging :as l] [app.util.time :as dt] [clojure.data.json :as json] [clojure.set :as set] diff --git a/backend/src/app/http/session.clj b/backend/src/app/http/session.clj index acff16136..a73765956 100644 --- a/backend/src/app/http/session.clj +++ b/backend/src/app/http/session.clj @@ -8,11 +8,11 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.config :as cfg] [app.db :as db] [app.metrics :as mtx] [app.util.async :as aa] - [app.util.logging :as l] [app.util.time :as dt] [app.worker :as wrk] [clojure.core.async :as a] diff --git a/backend/src/app/loggers/audit.clj b/backend/src/app/loggers/audit.clj index 37429f462..7a41a7e46 100644 --- a/backend/src/app/loggers/audit.clj +++ b/backend/src/app/loggers/audit.clj @@ -9,6 +9,7 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.common.transit :as t] [app.common.uuid :as uuid] @@ -16,7 +17,6 @@ [app.db :as db] [app.util.async :as aa] [app.util.http :as http] - [app.util.logging :as l] [app.util.time :as dt] [app.worker :as wrk] [clojure.core.async :as a] diff --git a/backend/src/app/loggers/database.clj b/backend/src/app/loggers/database.clj index a4cc8af7a..782f3ac2c 100644 --- a/backend/src/app/loggers/database.clj +++ b/backend/src/app/loggers/database.clj @@ -8,12 +8,12 @@ "A specific logger impl that persists errors on the database." (:require [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] [app.util.async :as aa] - [app.util.logging :as l] [app.util.template :as tmpl] [app.worker :as wrk] [clojure.core.async :as a] diff --git a/backend/src/app/loggers/loki.clj b/backend/src/app/loggers/loki.clj index 7344bad1f..5f6980d32 100644 --- a/backend/src/app/loggers/loki.clj +++ b/backend/src/app/loggers/loki.clj @@ -7,12 +7,12 @@ (ns app.loggers.loki "A Loki integration." (:require + [app.common.logging :as l] [app.common.spec :as us] [app.config :as cfg] [app.util.async :as aa] [app.util.http :as http] [app.util.json :as json] - [app.util.logging :as l] [app.worker :as wrk] [clojure.core.async :as a] [clojure.spec.alpha :as s] diff --git a/backend/src/app/loggers/mattermost.clj b/backend/src/app/loggers/mattermost.clj index f253973ca..ca23b9229 100644 --- a/backend/src/app/loggers/mattermost.clj +++ b/backend/src/app/loggers/mattermost.clj @@ -7,13 +7,13 @@ (ns app.loggers.mattermost "A mattermost integration for error reporting." (:require + [app.common.logging :as l] [app.config :as cf] [app.db :as db] [app.loggers.database :as ldb] [app.util.async :as aa] [app.util.http :as http] [app.util.json :as json] - [app.util.logging :as l] [app.worker :as wrk] [clojure.core.async :as a] [clojure.spec.alpha :as s] diff --git a/backend/src/app/loggers/sentry.clj b/backend/src/app/loggers/sentry.clj index b1d4b1d1d..78ac1ee39 100644 --- a/backend/src/app/loggers/sentry.clj +++ b/backend/src/app/loggers/sentry.clj @@ -7,11 +7,11 @@ (ns app.loggers.sentry "A mattermost integration for error reporting." (:require + [app.common.logging :as l] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] [app.util.async :as aa] - [app.util.logging :as l] [app.worker :as wrk] [clojure.core.async :as a] [clojure.spec.alpha :as s] diff --git a/backend/src/app/loggers/zmq.clj b/backend/src/app/loggers/zmq.clj index b5562e267..09d3abc1f 100644 --- a/backend/src/app/loggers/zmq.clj +++ b/backend/src/app/loggers/zmq.clj @@ -7,9 +7,9 @@ (ns app.loggers.zmq "A generic ZMQ listener." (:require + [app.common.logging :as l] [app.common.spec :as us] [app.util.json :as json] - [app.util.logging :as l] [app.util.time :as dt] [clojure.core.async :as a] [clojure.spec.alpha :as s] diff --git a/backend/src/app/main.clj b/backend/src/app/main.clj index 0470f7acf..946b9122b 100644 --- a/backend/src/app/main.clj +++ b/backend/src/app/main.clj @@ -6,8 +6,8 @@ (ns app.main (:require + [app.common.logging :as l] [app.config :as cf] - [app.util.logging :as l] [app.util.time :as dt] [integrant.core :as ig])) diff --git a/backend/src/app/metrics.clj b/backend/src/app/metrics.clj index 148e9b3a2..b1d0033e6 100644 --- a/backend/src/app/metrics.clj +++ b/backend/src/app/metrics.clj @@ -7,7 +7,7 @@ (ns app.metrics (:require [app.common.exceptions :as ex] - [app.util.logging :as l] + [app.common.logging :as l] [clojure.spec.alpha :as s] [integrant.core :as ig]) (:import diff --git a/backend/src/app/msgbus.clj b/backend/src/app/msgbus.clj index f7a013f72..146da0c83 100644 --- a/backend/src/app/msgbus.clj +++ b/backend/src/app/msgbus.clj @@ -8,10 +8,10 @@ "The msgbus abstraction implemented using redis as underlying backend." (:require [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.config :as cfg] [app.util.blob :as blob] - [app.util.logging :as l] [app.util.time :as dt] [clojure.core.async :as a] [clojure.spec.alpha :as s] diff --git a/backend/src/app/notifications.clj b/backend/src/app/notifications.clj index f7efa6f3f..f426923a9 100644 --- a/backend/src/app/notifications.clj +++ b/backend/src/app/notifications.clj @@ -7,12 +7,12 @@ (ns app.notifications "A websocket based notifications mechanism." (:require + [app.common.logging :as l] [app.common.spec :as us] [app.common.transit :as t] [app.db :as db] [app.metrics :as mtx] [app.util.async :as aa] - [app.util.logging :as l] [app.util.time :as dt] [app.worker :as wrk] [clojure.core.async :as a] diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index d77f83e3e..d2c12e8a4 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -8,12 +8,12 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.db :as db] [app.loggers.audit :as audit] [app.metrics :as mtx] [app.rlimits :as rlm] - [app.util.logging :as l] [app.util.services :as sv] [clojure.spec.alpha :as s] [cuerdas.core :as str] diff --git a/backend/src/app/rpc/mutations/ldap.clj b/backend/src/app/rpc/mutations/ldap.clj index d982a30b0..0f6675f24 100644 --- a/backend/src/app/rpc/mutations/ldap.clj +++ b/backend/src/app/rpc/mutations/ldap.clj @@ -7,13 +7,13 @@ (ns app.rpc.mutations.ldap (:require [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.config :as cfg] [app.db :as db] [app.loggers.audit :as audit] [app.rpc.mutations.profile :as profile-m] [app.rpc.queries.profile :as profile-q] - [app.util.logging :as l] [app.util.services :as sv] [clj-ldap.client :as ldap] [clojure.spec.alpha :as s] diff --git a/backend/src/app/srepl.clj b/backend/src/app/srepl.clj index 9d7c6c825..e71a2ac26 100644 --- a/backend/src/app/srepl.clj +++ b/backend/src/app/srepl.clj @@ -7,9 +7,9 @@ (ns app.srepl "Server Repl." (:require + [app.common.logging :as l] [app.common.spec :as us] [app.srepl.main] - [app.util.logging :as l] [clojure.core.server :as ccs] [clojure.main :as cm] [clojure.spec.alpha :as s] diff --git a/backend/src/app/storage.clj b/backend/src/app/storage.clj index e6acb0776..a06c228e5 100644 --- a/backend/src/app/storage.clj +++ b/backend/src/app/storage.clj @@ -9,6 +9,7 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.common.uuid :as uuid] [app.db :as db] @@ -16,7 +17,6 @@ [app.storage.fs :as sfs] [app.storage.impl :as impl] [app.storage.s3 :as ss3] - [app.util.logging :as l] [app.util.time :as dt] [app.worker :as wrk] [clojure.spec.alpha :as s] diff --git a/backend/src/app/tasks/file_media_gc.clj b/backend/src/app/tasks/file_media_gc.clj index aedcbc78b..2b8a13384 100644 --- a/backend/src/app/tasks/file_media_gc.clj +++ b/backend/src/app/tasks/file_media_gc.clj @@ -9,10 +9,10 @@ objects from files. A file is ellegible to be garbage collected after some period of inactivity (the default threshold is 72h)." (:require + [app.common.logging :as l] [app.common.pages.migrations :as pmg] [app.db :as db] [app.util.blob :as blob] - [app.util.logging :as l] [app.util.time :as dt] [clojure.spec.alpha :as s] [integrant.core :as ig])) diff --git a/backend/src/app/tasks/file_offload.clj b/backend/src/app/tasks/file_offload.clj index ee784d02d..a43afb8a9 100644 --- a/backend/src/app/tasks/file_offload.clj +++ b/backend/src/app/tasks/file_offload.clj @@ -7,11 +7,11 @@ (ns app.tasks.file-offload "A maintenance task that offloads file data to an external storage (S3)." (:require + [app.common.logging :as l] [app.common.spec :as us] [app.db :as db] [app.storage :as sto] [app.storage.impl :as simpl] - [app.util.logging :as l] [app.util.time :as dt] [clojure.spec.alpha :as s] [integrant.core :as ig])) diff --git a/backend/src/app/tasks/file_xlog_gc.clj b/backend/src/app/tasks/file_xlog_gc.clj index 3037a7d5b..b8dce2fa5 100644 --- a/backend/src/app/tasks/file_xlog_gc.clj +++ b/backend/src/app/tasks/file_xlog_gc.clj @@ -8,8 +8,8 @@ "A maintenance task that performs a garbage collection of the file change (transaction) log." (:require + [app.common.logging :as l] [app.db :as db] - [app.util.logging :as l] [app.util.time :as dt] [clojure.spec.alpha :as s] [integrant.core :as ig])) diff --git a/backend/src/app/tasks/objects_gc.clj b/backend/src/app/tasks/objects_gc.clj index 112524560..a3d06dcdd 100644 --- a/backend/src/app/tasks/objects_gc.clj +++ b/backend/src/app/tasks/objects_gc.clj @@ -8,11 +8,11 @@ "A maintenance task that performs a general purpose garbage collection of deleted objects." (:require + [app.common.logging :as l] [app.config :as cf] [app.db :as db] [app.storage :as sto] [app.storage.impl :as simpl] - [app.util.logging :as l] [app.util.time :as dt] [clojure.spec.alpha :as s] [cuerdas.core :as str] diff --git a/backend/src/app/tasks/tasks_gc.clj b/backend/src/app/tasks/tasks_gc.clj index a3560f0e1..788e29269 100644 --- a/backend/src/app/tasks/tasks_gc.clj +++ b/backend/src/app/tasks/tasks_gc.clj @@ -8,8 +8,8 @@ "A maintenance task that performs a cleanup of already executed tasks from the database table." (:require + [app.common.logging :as l] [app.db :as db] - [app.util.logging :as l] [app.util.time :as dt] [clojure.spec.alpha :as s] [integrant.core :as ig])) diff --git a/backend/src/app/util/logging.clj b/backend/src/app/util/logging.clj deleted file mode 100644 index 9a08e66b3..000000000 --- a/backend/src/app/util/logging.clj +++ /dev/null @@ -1,110 +0,0 @@ -;; 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/. -;; -;; Copyright (c) UXBOX Labs SL - -(ns app.util.logging - (:require - [clojure.pprint :refer [pprint]]) - (:import - 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 ::logger ::async ::raw] :as props}] - (let [props (dissoc props :level :cause ::logger ::async ::raw) - 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 [_#] - (let [message# (or ~raw (build-map-message ~props))] - (write-log! ~logger-sym ~level-sym ~cause message#)))) - `(let [message# (or ~raw (build-map-message ~props))] - (write-log! ~logger-sym ~level-sym ~cause message#))))))) - -(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)) diff --git a/backend/src/app/util/migrations.clj b/backend/src/app/util/migrations.clj index f79c50b2b..7b7fb8a44 100644 --- a/backend/src/app/util/migrations.clj +++ b/backend/src/app/util/migrations.clj @@ -6,7 +6,7 @@ (ns app.util.migrations (:require - [app.util.logging :as l] + [app.common.logging :as l] [clojure.java.io :as io] [clojure.spec.alpha :as s] [next.jdbc :as jdbc])) diff --git a/backend/src/app/worker.clj b/backend/src/app/worker.clj index ed9d1982f..49370e164 100644 --- a/backend/src/app/worker.clj +++ b/backend/src/app/worker.clj @@ -9,12 +9,12 @@ (:require [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.logging :as l] [app.common.spec :as us] [app.common.uuid :as uuid] [app.db :as db] [app.metrics :as mtx] [app.util.async :as aa] - [app.util.logging :as l] [app.util.time :as dt] [clojure.core.async :as a] [clojure.spec.alpha :as s] diff --git a/common/src/app/common/logging.cljc b/common/src/app/common/logging.cljc new file mode 100644 index 000000000..a861bcc27 --- /dev/null +++ b/common/src/app/common/logging.cljc @@ -0,0 +1,297 @@ +;; 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/. +;; +;; Copyright (c) UXBOX Labs SL + +(ns app.common.logging + (:require + [app.common.exceptions :as ex] + [clojure.pprint :refer [pprint]] + [cuerdas.core :as str] + #?(:cljs [goog.log :as glog])) + #?(:cljs (:require-macros [app.common.logging])) + #?(:clj + (:import + 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))) + +#?(:clj + (defn build-map-message + [m] + (let [message (MapMessage. (count m))] + (reduce-kv #(.with ^MapMessage %1 (name %2) %3) message m)))) + +#?(:clj + (def logger-context + (LogManager/getContext false))) + +#?(:clj + (def logging-agent + (agent nil :error-mode :continue))) + +(defn get-logger + [lname] + #?(:clj (.getLogger ^LoggerContext logger-context ^String lname) + :cljs + (glog/getLogger + (cond + (string? lname) lname + (= lname :root) "" + (simple-ident? lname) (name lname) + (qualified-ident? lname) (str (namespace lname) "." (name lname)) + :else (str lname))))) + +(defn get-level + [level] + #?(:clj + (case level + :trace Level/TRACE + :debug Level/DEBUG + :info Level/INFO + :warn Level/WARN + :error Level/ERROR + :fatal Level/FATAL) + :cljs + (case level + :off (.-OFF ^js glog/Level) + :shout (.-SHOUT ^js glog/Level) + :error (.-SEVERE ^js glog/Level) + :severe (.-SEVERE ^js glog/Level) + :warning (.-WARNING ^js glog/Level) + :warn (.-WARNING ^js glog/Level) + :info (.-INFO ^js glog/Level) + :config (.-CONFIG ^js glog/Level) + :debug (.-FINE ^js glog/Level) + :fine (.-FINE ^js glog/Level) + :finer (.-FINER ^js glog/Level) + :trace (.-FINER ^js glog/Level) + :finest (.-FINEST ^js glog/Level) + :all (.-ALL ^js glog/Level)))) + +(defn write-log! + [logger level exception message] + #?(:clj + (if exception + (.log ^Logger logger + ^Level level + ^Object message + ^Throwable exception) + (.log ^Logger logger + ^Level level + ^Object message)) + :cljs + (when glog/ENABLED + (when-let [l (get-logger logger)] + (let [level (get-level level) + record (glog/LogRecord. level message (.getName ^js l))] + (when exception (.setException record exception)) + (glog/publishLogRecord l record)))))) + +#?(:clj + (defn enabled? + [logger level] + (.isEnabled ^Logger logger ^Level level))) + +(defmacro log + [& {:keys [level cause ::logger ::async ::raw] :as props}] + (if (:ns &env) ; CLJS + `(write-log! ~(or logger (str *ns*)) + ~level + ~cause + ~(dissoc props :level :cause ::logger ::raw)) + (let [props (dissoc props :level :cause ::logger ::async ::raw) + 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 [_#] + (let [message# (or ~raw (build-map-message ~props))] + (write-log! ~logger-sym ~level-sym ~cause message#)))) + `(let [message# (or ~raw (build-map-message ~props))] + (write-log! ~logger-sym ~level-sym ~cause message#)))))))) + +(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)) + +(defmacro set-level! + ([level] + (when (:ns &env) + `(set-level* ~(str *ns*) ~level))) + ([n level] + (when (:ns &env) + `(set-level* ~n ~level)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; CLJ Specific +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +#?(:clj + (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))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; CLJS Specific +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +#?(:cljs + (def ^:private colors + {:gray3 "#8e908c" + :gray4 "#969896" + :gray5 "#4d4d4c" + :gray6 "#282a2e" + :black "#1d1f21" + :red "#c82829" + :blue "#4271ae" + :orange "#f5871f"})) + +#?(:cljs + (defn- level->color + [level] + (letfn [(get-level-value [l] (.-value ^js (get-level l)))] + (condp <= (get-level-value level) + (get-level-value :error) (get colors :red) + (get-level-value :warn) (get colors :orange) + (get-level-value :info) (get colors :blue) + (get-level-value :debug) (get colors :gray4) + (get-level-value :trace) (get colors :gray3) + (get colors :gray2))))) + +#?(:cljs + (defn- level->short-name + [l] + (case l + :fine "DBG" + :debug "DBG" + :finer "TRC" + :trace "TRC" + :info "INF" + :warn "WRN" + :warning "WRN" + :error "ERR" + (subs (.-name ^js (get-level l)) 0 3)))) + +#?(:cljs + (defn set-level* + "Set the level (a keyword) of the given logger, identified by name." + [name lvl] + (some-> (get-logger name) + (glog/setLevel (get-level lvl))))) + + +#?(:cljs + (defn set-levels! + [lvls] + (doseq [[logger level] lvls + :let [level (if (string? level) (keyword level) level)]] + (set-level* logger level)))) + +#?(:cljs + (defn- prepare-message + [message] + (loop [kvpairs (seq message) + message (array-map) + specials []] + (if (nil? kvpairs) + [message specials] + (let [[k v] (first kvpairs)] + (cond + (= k :err) + (recur (next kvpairs) + message + (conj specials [:error nil v])) + + (and (qualified-ident? k) + (= "js" (namespace k))) + (recur (next kvpairs) + message + (conj specials [:js (name k) (if (object? v) v (clj->js v))])) + + :else + (recur (next kvpairs) + (assoc message k v) + specials))))))) + +#?(:cljs + (defn default-handler + [{:keys [message level logger-name]}] + (let [header-styles (str "font-weight: 600; color: " (level->color level)) + normal-styles (str "font-weight: 300; color: " (get colors :gray6)) + level-name (level->short-name level) + header (str "%c" level-name " [" logger-name "] ")] + + (if (string? message) + (let [message (str header "%c" message)] + (js/console.log message header-styles normal-styles)) + (let [[message specials] (prepare-message message)] + (if (seq specials) + (let [message (str header "%c" (pr-str message))] + (js/console.group message header-styles normal-styles) + (doseq [[type n v] specials] + (case type + :js (js/console.log n v) + :error (if (ex/ex-info? v) + (js/console.error (pr-str v)) + (js/console.error v)))) + (js/console.groupEnd message)) + (let [message (str header "%c" (pr-str message))] + (js/console.log message header-styles normal-styles)))))))) + +#?(:cljs + (defn record->map + [^js record] + {:seqn (.-sequenceNumber_ record) + :time (.-time_ record) + :level (keyword (str/lower (.-name (.-level_ record)))) + :message (.-msg_ record) + :logger-name (.-loggerName_ record) + :exception (.-exception_ record)})) + +#?(:cljs + (defonce default-console-handler + (comp default-handler record->map))) + +#?(:cljs + (defn initialize! + [] + (let [l (get-logger :root)] + (glog/removeHandler l default-console-handler) + (glog/addHandler l default-console-handler) + nil))) + + diff --git a/frontend/src/app/config.cljs b/frontend/src/app/config.cljs index 109761883..b1b06a43b 100644 --- a/frontend/src/app/config.cljs +++ b/frontend/src/app/config.cljs @@ -10,6 +10,7 @@ [app.common.spec :as us] [app.common.uri :as u] [app.common.version :as v] + [app.common.logging :as log] [app.util.avatars :as avatars] [app.util.dom :as dom] [app.util.globals :refer [global location]] @@ -102,10 +103,6 @@ (not (str/ends-with? (:path uri) "/")) (update :path #(str % "/"))))) -(when (= :browser @target) - (js/console.log - (str/format "Welcome to penpot! version='%s' base-uri='%s'." (:full @version) (str public-uri)))) - ;; --- Helper Functions (defn ^boolean check-browser? [candidate] diff --git a/frontend/src/app/main.cljs b/frontend/src/app/main.cljs index 386ac5948..a8d258d9c 100644 --- a/frontend/src/app/main.cljs +++ b/frontend/src/app/main.cljs @@ -6,9 +6,10 @@ (ns app.main (:require + [app.common.logging :as log] [app.common.spec :as us] [app.common.uuid :as uuid] - [app.config :as cfg] + [app.config :as cf] [app.main.data.events :as ev] [app.main.data.messages :as dm] [app.main.data.users :as du] @@ -20,7 +21,6 @@ [app.main.worker] [app.util.dom :as dom] [app.util.i18n :as i18n] - [app.util.logging :as log] [app.util.router :as rt] [app.util.storage :refer [storage]] [app.util.theme :as theme] @@ -33,6 +33,11 @@ (log/set-level! :root :warn) (log/set-level! :app :info) + +(when (= :browser @cf/target) + (log/info :message "wecome to penpot" :version (:full @cf/version) :public-uri (str cf/public-uri))) + + (declare reinit) (s/def ::any any?) @@ -105,8 +110,8 @@ (defn ^:export init [] (sentry/init!) - (i18n/init! cfg/translations) - (theme/init! cfg/themes) + (i18n/init! cf/translations) + (theme/init! cf/themes) (init-ui) (st/emit! (initialize))) diff --git a/frontend/src/app/main/data/fonts.cljs b/frontend/src/app/main/data/fonts.cljs index 81d00c9e5..96fb4dbba 100644 --- a/frontend/src/app/main/data/fonts.cljs +++ b/frontend/src/app/main/data/fonts.cljs @@ -8,12 +8,12 @@ (:require ["opentype.js" :as ot] [app.common.data :as d] + [app.common.logging :as log] [app.common.media :as cm] [app.common.spec :as us] [app.common.uuid :as uuid] [app.main.fonts :as fonts] [app.main.repo :as rp] - [app.util.logging :as log] [app.util.webapi :as wa] [beicon.core :as rx] [cuerdas.core :as str] diff --git a/frontend/src/app/main/data/shortcuts.cljs b/frontend/src/app/main/data/shortcuts.cljs index 69c9596bc..0494f9913 100644 --- a/frontend/src/app/main/data/shortcuts.cljs +++ b/frontend/src/app/main/data/shortcuts.cljs @@ -8,9 +8,9 @@ (:refer-clojure :exclude [meta reset!]) (:require ["mousetrap" :as mousetrap] + [app.common.logging :as log] [app.common.spec :as us] - [app.config :as cfg] - [app.util.logging :as log] + [app.config :as cf] [cljs.spec.alpha :as s] [potok.core :as ptk])) @@ -37,7 +37,7 @@ "Adds the control/command modifier to a shortcuts depending on the operating system for the user" [shortcut] - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) (str "command+" shortcut) (str "ctrl+" shortcut))) @@ -55,12 +55,12 @@ [key] ;; If the key is "+" we need to surround with quotes ;; otherwise will not be very readable - (let [key (if (and (not (cfg/check-platform? :macos)) + (let [key (if (and (not (cf/check-platform? :macos)) (= key "+")) "\"+\"" key)] (str - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) mac-command "Ctrl+") key))) @@ -68,7 +68,7 @@ (defn shift [key] (str - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) mac-shift "Shift+") key)) @@ -76,7 +76,7 @@ (defn alt [key] (str - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) mac-option "Alt+") key)) @@ -91,19 +91,19 @@ (defn supr [] - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) mac-delete "Supr")) (defn esc [] - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) mac-esc "Escape")) (defn enter [] - (if (cfg/check-platform? :macos) + (if (cf/check-platform? :macos) mac-enter "Enter")) diff --git a/frontend/src/app/main/data/workspace/changes.cljs b/frontend/src/app/main/data/workspace/changes.cljs index 4edfa71fd..99c050db6 100644 --- a/frontend/src/app/main/data/workspace/changes.cljs +++ b/frontend/src/app/main/data/workspace/changes.cljs @@ -7,6 +7,7 @@ (ns app.main.data.workspace.changes (:require [app.common.data :as d] + [app.common.logging :as log] [app.common.pages :as cp] [app.common.pages.spec :as spec] [app.common.spec :as us] @@ -14,7 +15,6 @@ [app.main.data.workspace.undo :as dwu] [app.main.store :as st] [app.main.worker :as uw] - [app.util.logging :as log] [beicon.core :as rx] [cljs.spec.alpha :as s] [potok.core :as ptk])) diff --git a/frontend/src/app/main/data/workspace/common.cljs b/frontend/src/app/main/data/workspace/common.cljs index 0fe0939d7..8721a3448 100644 --- a/frontend/src/app/main/data/workspace/common.cljs +++ b/frontend/src/app/main/data/workspace/common.cljs @@ -7,6 +7,7 @@ (ns app.main.data.workspace.common (:require [app.common.data :as d] + [app.common.logging :as log] [app.common.geom.proportions :as gpr] [app.common.geom.shapes :as gsh] [app.common.pages :as cp] @@ -17,7 +18,6 @@ [app.main.data.workspace.undo :as dwu] [app.main.streams :as ms] [app.main.worker :as uw] - [app.util.logging :as log] [beicon.core :as rx] [cljs.spec.alpha :as s] [potok.core :as ptk])) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 995fb674c..c7a8dc1e3 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -7,6 +7,7 @@ (ns app.main.data.workspace.libraries (:require [app.common.data :as d] + [app.common.logging :as log] [app.common.geom.point :as gpt] [app.common.geom.shapes :as geom] [app.common.pages :as cp] @@ -21,7 +22,6 @@ [app.main.repo :as rp] [app.main.store :as st] [app.util.i18n :refer [tr]] - [app.util.logging :as log] [app.util.router :as rt] [app.util.time :as dt] [beicon.core :as rx] diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index 226d5b2ba..7e5bdc75b 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -7,13 +7,13 @@ (ns app.main.data.workspace.libraries-helpers (:require [app.common.data :as d] + [app.common.logging :as log] [app.common.geom.point :as gpt] [app.common.geom.shapes :as geom] [app.common.pages :as cp] [app.common.spec :as us] [app.common.text :as txt] [app.main.data.workspace.groups :as dwg] - [app.util.logging :as log] [cljs.spec.alpha :as s] [clojure.set :as set])) diff --git a/frontend/src/app/main/fonts.cljs b/frontend/src/app/main/fonts.cljs index dbd50cde3..296c8f7f1 100644 --- a/frontend/src/app/main/fonts.cljs +++ b/frontend/src/app/main/fonts.cljs @@ -9,11 +9,11 @@ (:require-macros [app.main.fonts :refer [preload-gfonts]]) (:require [app.common.data :as d] + [app.common.logging :as log] [app.common.text :as txt] [app.config :as cf] [app.util.dom :as dom] [app.util.http :as http] - [app.util.logging :as log] [app.util.object :as obj] [beicon.core :as rx] [clojure.set :as set] diff --git a/frontend/src/app/main/sentry.cljs b/frontend/src/app/main/sentry.cljs index ad6a1895c..8424d3495 100644 --- a/frontend/src/app/main/sentry.cljs +++ b/frontend/src/app/main/sentry.cljs @@ -10,6 +10,7 @@ ["@sentry/browser" :as sentry] [app.common.exceptions :as ex] [app.common.uuid :as uuid] + [app.common.logging :as log] [app.config :as cf] [app.main.refs :as refs])) diff --git a/frontend/src/app/main/ui/dashboard/fonts.cljs b/frontend/src/app/main/ui/dashboard/fonts.cljs index 1b12fc298..dd35cd446 100644 --- a/frontend/src/app/main/ui/dashboard/fonts.cljs +++ b/frontend/src/app/main/ui/dashboard/fonts.cljs @@ -18,13 +18,10 @@ [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] [app.util.keyboard :as kbd] - [app.util.logging :as log] [beicon.core :as rx] [cuerdas.core :as str] [rumext.alpha :as mf])) -(log/set-level! :trace) - (defn- use-set-page-title [team section] (mf/use-effect diff --git a/frontend/src/app/main/ui/dashboard/import.cljs b/frontend/src/app/main/ui/dashboard/import.cljs index dcc0663b5..3c11e03c9 100644 --- a/frontend/src/app/main/ui/dashboard/import.cljs +++ b/frontend/src/app/main/ui/dashboard/import.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.dashboard.import (:require [app.common.data :as d] + [app.common.logging :as log] [app.main.data.events :as ev] [app.main.data.modal :as modal] [app.main.store :as st] @@ -16,7 +17,6 @@ [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] [app.util.keyboard :as kbd] - [app.util.logging :as log] [beicon.core :as rx] [potok.core :as ptk] [rumext.alpha :as mf])) diff --git a/frontend/src/app/main/ui/hooks.cljs b/frontend/src/app/main/ui/hooks.cljs index 257b3b239..484974c1d 100644 --- a/frontend/src/app/main/ui/hooks.cljs +++ b/frontend/src/app/main/ui/hooks.cljs @@ -11,13 +11,10 @@ [app.main.store :as st] [app.util.dom :as dom] [app.util.dom.dnd :as dnd] - [app.util.logging :as log] [app.util.timers :as ts] [beicon.core :as rx] [rumext.alpha :as mf])) -(log/set-level! :warn) - (defn use-rxsub [ob] (let [[state reset-state!] (mf/useState @ob)] @@ -101,7 +98,6 @@ subscribe-to-drag-end (fn [] (when (nil? (:subscr @state)) - ;; (js/console.log "subscribing" (:name data)) (swap! state #(assoc % :subscr (rx/sub! global-drag-end cleanup))))) diff --git a/frontend/src/app/main/ui/share_link.cljs b/frontend/src/app/main/ui/share_link.cljs index b9a84565b..1e4e90102 100644 --- a/frontend/src/app/main/ui/share_link.cljs +++ b/frontend/src/app/main/ui/share_link.cljs @@ -7,6 +7,7 @@ (ns app.main.ui.share-link (:require [app.common.data :as d] + [app.common.logging :as log] [app.config :as cf] [app.main.data.common :as dc] [app.main.data.messages :as dm] @@ -16,7 +17,6 @@ [app.main.ui.icons :as i] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] - [app.util.logging :as log] [app.util.router :as rt] [app.util.webapi :as wapi] [rumext.alpha :as mf])) diff --git a/frontend/src/app/main/ui/workspace.cljs b/frontend/src/app/main/ui/workspace.cljs index e2eaf6136..1ccc80d5b 100644 --- a/frontend/src/app/main/ui/workspace.cljs +++ b/frontend/src/app/main/ui/workspace.cljs @@ -121,7 +121,6 @@ (fn [] (st/emit! (dw/setup-layout layout-name)))) - (mf/use-effect (mf/deps project-id file-id) (fn [] diff --git a/frontend/src/app/main/ui/workspace/shapes/text.cljs b/frontend/src/app/main/ui/workspace/shapes/text.cljs index 6f3b652ce..704920fba 100644 --- a/frontend/src/app/main/ui/workspace/shapes/text.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/text.cljs @@ -6,6 +6,7 @@ (ns app.main.ui.workspace.shapes.text (:require + [app.common.logging :as log] [app.common.math :as mth] [app.main.data.workspace.texts :as dwt] [app.main.refs :as refs] @@ -13,7 +14,6 @@ [app.main.ui.shapes.shape :refer [shape-container]] [app.main.ui.shapes.text :as text] [app.util.dom :as dom] - [app.util.logging :as log] [app.util.object :as obj] [app.util.text-editor :as ted] [app.util.timers :as timers] diff --git a/frontend/src/app/util/logging.clj b/frontend/src/app/util/logging.clj deleted file mode 100644 index f888f1bc8..000000000 --- a/frontend/src/app/util/logging.clj +++ /dev/null @@ -1,46 +0,0 @@ -;; 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/. -;; -;; Copyright (c) UXBOX Labs SL - -(ns app.util.logging) - -(defn- log-expr [_form level keyvals] - (let [keyvals-map (apply array-map keyvals) - ;;formatter (::formatter keyvals-map 'identity) - ] - `(log ~(::logger keyvals-map (str *ns*)) - ~level - ~(-> keyvals-map - (dissoc ::logger) - #_(assoc :line (:line (meta form)))) - ~(:err keyvals-map)))) - -(defmacro set-level! - ([level] - `(set-level* ~(str *ns*) ~level)) - ([n level] - `(set-level* ~n ~level))) - -(defmacro error [& keyvals] - (log-expr &form :error keyvals)) - -(defmacro warn [& keyvals] - (log-expr &form :warn keyvals)) - -(defmacro info [& keyvals] - (log-expr &form :info keyvals)) - -(defmacro debug [& keyvals] - (log-expr &form :debug keyvals)) - -(defmacro trace [& keyvals] - (log-expr &form :trace keyvals)) - -(defmacro spy [form] - (let [res (gensym)] - `(let [~res ~form] - ~(log-expr &form :debug [:spy `'~form - :=> res]) - ~res))) diff --git a/frontend/src/app/util/logging.cljs b/frontend/src/app/util/logging.cljs deleted file mode 100644 index b2bfaaff9..000000000 --- a/frontend/src/app/util/logging.cljs +++ /dev/null @@ -1,189 +0,0 @@ -;; 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/. -;; -;; Copyright (c) UXBOX Labs SL -;; -;; This code is highly inspired on the lambdaisland/glogi library but -;; adapted and simplified to our needs. The adapted code shares the -;; same license. You can found the origianl source code here: -;; https://github.com/lambdaisland/glogi - -(ns app.util.logging - (:require - [app.common.exceptions :as ex] - [cuerdas.core :as str] - [goog.log :as glog]) - (:require-macros [app.util.logging])) - -(defn- logger-name - [s] - (cond - (string? s) s - (= s :root) "" - (simple-ident? s) (name s) - (qualified-ident? s) (str (namespace s) "." (name s)) - :else (str s))) - -(defn get-logger - [n] - (glog/getLogger (logger-name n))) - -(def levels - {:off (.-OFF ^js glog/Level) - :shout (.-SHOUT ^js glog/Level) - :error (.-SEVERE ^js glog/Level) - :severe (.-SEVERE ^js glog/Level) - :warning (.-WARNING ^js glog/Level) - :warn (.-WARNING ^js glog/Level) - :info (.-INFO ^js glog/Level) - :config (.-CONFIG ^js glog/Level) - :debug (.-FINE ^js glog/Level) - :fine (.-FINE ^js glog/Level) - :finer (.-FINER ^js glog/Level) - :trace (.-FINER ^js glog/Level) - :finest (.-FINEST ^js glog/Level) - :all (.-ALL ^js glog/Level)}) - -(def colors - {:gray3 "#8e908c" - :gray4 "#969896" - :gray5 "#4d4d4c" - :gray6 "#282a2e" - :black "#1d1f21" - :red "#c82829" - :blue "#4271ae" - :orange "#f5871f"}) - -(defn- get-level-value - [level] - (if (instance? glog/Level level) - (.-value ^js level) - (.-value ^js (get levels level)))) - -(defn- level->color - [level] - (condp <= (get-level-value level) - (get-level-value :error) (get colors :red) - (get-level-value :warn) (get colors :orange) - (get-level-value :info) (get colors :blue) - (get-level-value :debug) (get colors :gray4) - (get-level-value :trace) (get colors :gray3) - (get colors :gray2))) - -(defn- level->short-name - [l] - (case l - :fine "DBG" - :debug "DBG" - :finer "TRC" - :trace "TRC" - :info "INF" - :warn "WRN" - :warning "WRN" - :error "ERR" - (subs (.-name ^js (get levels l)) 0 3))) - -(defn- make-log-record - [level message name exception] - (let [record (glog/LogRecord. level message name)] - (when exception (.setException record exception)) - record)) - -(defn log - "Output a log message to the given logger, optionally with an exception to be - logged." - ([name lvl message] - (log name lvl message nil)) - ([name lvl message exception] - (when glog/ENABLED - (when-let [l (get-logger name)] - (glog/publishLogRecord l (make-log-record (get levels lvl) message name exception)))))) - -(defn set-level* - "Set the level (a keyword) of the given logger, identified by name." - [name lvl] - (assert (contains? levels lvl)) - (some-> (get-logger name) - (glog/setLevel (get levels lvl)))) - -(defn set-levels! - [lvls] - (doseq [[logger level] lvls - :let [level (if (string? level) (keyword level) level)]] - (set-level* logger level))) - -(defn record->map - [^js record] - {:seqn (.-sequenceNumber_ record) - :time (.-time_ record) - :level (keyword (str/lower (.-name (.-level_ record)))) - :message (.-msg_ record) - :logger-name (.-loggerName_ record) - :exception (.-exception_ record)}) - -(defn add-handler! - ([handler-fn] - (add-handler! :root handler-fn)) - ([logger-or-name handler-fn] - (when-let [l (get-logger logger-or-name)] - (glog/removeHandler l handler-fn) - (glog/addHandler l handler-fn)))) - -(defn- prepare-message - [message] - (loop [kvpairs (seq message) - message (array-map) - specials []] - (if (nil? kvpairs) - [message specials] - (let [[k v] (first kvpairs)] - (cond - (= k :err) - (recur (next kvpairs) - message - (conj specials [:error nil v])) - - (and (qualified-ident? k) - (= "js" (namespace k))) - (recur (next kvpairs) - message - (conj specials [:js (name k) (if (object? v) v (clj->js v))])) - - :else - (recur (next kvpairs) - (assoc message k v) - specials)))))) - -(defn default-handler - [{:keys [message level logger-name]}] - (let [header-styles (str "font-weight: 600; color: " (level->color level)) - normal-styles (str "font-weight: 300; color: " (get colors :gray6)) - level-name (level->short-name level) - header (str "%c" level-name " [" logger-name "] ")] - - (if (string? message) - (let [message (str header "%c" message)] - (js/console.log message header-styles normal-styles)) - (let [[message specials] (prepare-message message)] - (if (seq specials) - (let [message (str header "%c" (pr-str message))] - (js/console.group message header-styles normal-styles) - (doseq [[type n v] specials] - (case type - :js (js/console.log n v) - :error (if (ex/ex-info? v) - (js/console.error (pr-str v)) - (js/console.error v)))) - (js/console.groupEnd message)) - (let [message (str header "%c" (pr-str message))] - (js/console.log message header-styles normal-styles))))))) - -(defonce default-console-handler - #(default-handler (record->map %))) - -(defn initialize! - [] - (add-handler! :root default-console-handler) - nil) - diff --git a/frontend/src/app/worker/import.cljs b/frontend/src/app/worker/import.cljs index a3bb981b3..b94bf4070 100644 --- a/frontend/src/app/worker/import.cljs +++ b/frontend/src/app/worker/import.cljs @@ -8,6 +8,7 @@ (:refer-clojure :exclude [resolve]) (:require [app.common.data :as d] + [app.common.logging :as log] [app.common.file-builder :as fb] [app.common.pages :as cp] [app.common.text :as ct] @@ -17,7 +18,6 @@ [app.util.http :as http] [app.util.import.parser :as cip] [app.util.json :as json] - [app.util.logging :as log] [app.util.zip :as uz] [app.worker.impl :as impl] [beicon.core :as rx]