diff --git a/projects/api/project.clj b/projects/api/project.clj index 7cb81a4..6da8fd3 100644 --- a/projects/api/project.clj +++ b/projects/api/project.clj @@ -14,7 +14,7 @@ {:provided {:dependencies [[org.clojure/clojurescript "1.11.132"] - [org.clojure/clojure "1.11.4"] + [org.clojure/clojure "1.12.0"] [com.taoensso/telemere "1.0.0-SNAPSHOT"]]} :dev diff --git a/projects/main/project.clj b/projects/main/project.clj index 3be2512..00e6986 100644 --- a/projects/main/project.clj +++ b/projects/main/project.clj @@ -10,7 +10,7 @@ :scm {:name "git" :url "https://github.com/taoensso/telemere"} :dependencies - [[com.taoensso/encore "3.117.0"]] + [[com.taoensso/encore "3.120.0-SNAPSHOT"]] :test-paths ["test" #_"src"] @@ -18,7 +18,7 @@ {;; :default [:base :system :user :provided :dev] :provided {:dependencies [[org.clojure/clojurescript "1.11.132"] [org.clojure/clojure "1.11.4"]]} - :c1.12 {:dependencies [[org.clojure/clojure "1.12.0-rc1"]]} + :c1.12 {:dependencies [[org.clojure/clojure "1.12.0"]]} :c1.11 {:dependencies [[org.clojure/clojure "1.11.4"]]} :c1.10 {:dependencies [[org.clojure/clojure "1.10.3"]]} @@ -55,9 +55,9 @@ #_[org.slf4j/slf4j-nop "2.0.16"] ;;; For optional handlers - [io.opentelemetry/opentelemetry-api "1.41.0"] - [io.opentelemetry/opentelemetry-sdk-extension-autoconfigure "1.41.0"] - [io.opentelemetry/opentelemetry-exporter-otlp "1.41.0"] + [io.opentelemetry/opentelemetry-api "1.42.1"] + [io.opentelemetry/opentelemetry-sdk-extension-autoconfigure "1.42.1"] + [io.opentelemetry/opentelemetry-exporter-otlp "1.42.1"] #_[io.opentelemetry/opentelemetry-exporters-jaeger "0.9.1"] [metosin/jsonista "0.3.10"] [com.draines/postal "2.0.5"] diff --git a/projects/main/src/taoensso/telemere.cljc b/projects/main/src/taoensso/telemere.cljc index 4a0b0a6..67cf65a 100644 --- a/projects/main/src/taoensso/telemere.cljc +++ b/projects/main/src/taoensso/telemere.cljc @@ -30,7 +30,7 @@ (remove-ns 'taoensso.telemere) (:api (enc/interns-overview))) -(enc/assert-min-encore-version [3 117 0]) +(enc/assert-min-encore-version [3 120 0]) ;;;; TODO ;; - Solution and docs for lib authors @@ -112,7 +112,13 @@ (utils/nano-uid-fn {:secure? false})) -(comment (enc/qb 1e6 (enc/uuid) (*uid-fn* true) (*uid-fn* false))) ; [168.83 79.02 62.95] +(comment + ((utils/nano-uid-fn) true) ; "vdh0bL0YHOXYKWn4sM88e" + ((utils/hex-uid-fn) true) ; "62c0f80d3fb15fb4e356bdd84bae223e" + (let [nuid (utils/nano-uid-fn) + huid (utils/hex-uid-fn)] + (enc/qb 1e6 ; [168.29 21.85 68.6 46.63] + (enc/uuid) *uid-fn* (nuid true) (huid true)))) ;;;; OpenTelemetry @@ -185,7 +191,7 @@ (when impl/present:otel? (delay (otel-get-default-providers))))) #?(:clj - (def ^:dynamic *otel-tracer* + (def ^:dynamic ^:no-doc *otel-tracer* "OpenTelemetry `Tracer` to use for Telemere's tracing signal creators (`trace!`, `span!`, etc.), ∈ #{nil io.opentelemetry.api.trace.Tracer Delay}. See also `otel-tracing?`, `otel-get-default-providers`." diff --git a/projects/main/src/taoensso/telemere/tools_logging.clj b/projects/main/src/taoensso/telemere/tools_logging.clj index c68c095..04b1e0f 100644 --- a/projects/main/src/taoensso/telemere/tools_logging.clj +++ b/projects/main/src/taoensso/telemere/tools_logging.clj @@ -15,12 +15,12 @@ (defmacro ^:private when-debug [& body] (when #_true false `(do ~@body))) (deftype TelemereLogger [logger-name] - + ;; `logger-name` is typically ns string clojure.tools.logging.impl/Logger (enabled? [_ level] (when-debug (println [:tools-logging/enabled? level logger-name])) (impl/signal-allowed? - {:location {:ns logger-name} ; Typically *ns* string + {:location {:ns logger-name} :kind :tools-logging :level level})) @@ -28,7 +28,7 @@ (when-debug (println [:tools-logging/write! level logger-name])) (impl/signal! {:allow? true ; Pre-filtered by `enabled?` call - :location {:ns logger-name} ; Typically *ns* string + :location {:ns logger-name} :kind :tools-logging :level level :error throwable diff --git a/projects/main/src/taoensso/telemere/utils.cljc b/projects/main/src/taoensso/telemere/utils.cljc index 732e2dc..df8a106 100644 --- a/projects/main/src/taoensso/telemere/utils.cljc +++ b/projects/main/src/taoensso/telemere/utils.cljc @@ -754,8 +754,8 @@ Options: `:incl-newline?` - Include terminating system newline? (default true) - `:preamble-fn` - (fn [signal]) => signal preamble string, see [1]. - `:content-fn` - (fn [signal]) => signal content string, see [2]. + `:preamble-fn` - (fn [signal]) => signal preamble string, see [1] + `:content-fn` - (fn [signal]) => signal content string, see [2] [1] `taoensso.telemere.utils/signal-preamble-fn`, etc. [2] `taoensso.telemere.utils/signal-content-fn`, etc. diff --git a/projects/main/test/taoensso/telemere_tests.cljc b/projects/main/test/taoensso/telemere_tests.cljc index 3662c2c..369b24c 100644 --- a/projects/main/test/taoensso/telemere_tests.cljc +++ b/projects/main/test/taoensso/telemere_tests.cljc @@ -8,15 +8,16 @@ :refer [signal! with-signal with-signals] :rename {signal! sig!, with-signal with-sig, with-signals with-sigs}] - [taoensso.telemere.api :as api] - [taoensso.telemere.utils :as utils] - [taoensso.telemere.timbre :as timbre] - #_[taoensso.telemere.tools-logging :as tools-logging] - #_[taoensso.telemere.streams :as streams] - #?(:clj [taoensso.telemere.slf4j :as slf4j]) - #?(:clj [taoensso.telemere.open-telemetry :as otel]) - #?(:clj [taoensso.telemere.files :as files]) - #?(:clj [clojure.tools.logging :as ctl]))) + [taoensso.telemere.api :as api] + [taoensso.telemere.utils :as utils] + [taoensso.telemere.timbre :as timbre] + #_[taoensso.telemere.tools-logging :as tools-logging] + #_[taoensso.telemere.streams :as streams] + #?@(:clj + [[taoensso.telemere.slf4j :as slf4j] + [taoensso.telemere.open-telemetry :as otel] + [taoensso.telemere.files :as files] + [clojure.tools.logging :as ctl]]))) (comment (remove-ns 'taoensso.telemere-tests) @@ -687,9 +688,9 @@ (is (sm? (with-sig (-> (.atWarn sl) (.log "Hello"))) {:level :warn, :ns "my.class", :kind :slf4j, :msg_ "Hello", :inst pinst?}) "Fluent API: warn basics")]) (testing "Message formatting" - (let [msgp "X is {} and Y is {}", expected {:msg_ "X is x and Y is y", :data {:slf4j/args ["x" "y"]}}] - [(is (sm? (with-sig (.info sl msgp "x" "y")) expected) "Legacy API: formatted message, raw args") - (is (sm? (with-sig (-> (.atInfo sl) (.setMessage msgp) (.addArgument "x") (.addArgument "y") (.log))) expected) "Fluent API: formatted message, raw args")])) + (let [msgp "x={},y={}", expected {:msg_ "x=1,y=2", :data {:slf4j/args ["1" "2"]}}] + [(is (sm? (with-sig (.info sl msgp "1" "2")) expected) "Legacy API: formatted message, raw args") + (is (sm? (with-sig (-> (.atInfo sl) (.setMessage msgp) (.addArgument "1") (.addArgument "2") (.log))) expected) "Fluent API: formatted message, raw args")])) (is (sm? (with-sig (-> (.atInfo sl) (.addKeyValue "k1" "v1") (.addKeyValue "k2" "v2") (.log))) {:data {:slf4j/kvs {"k1" "v1", "k2" "v2"}}}) "Fluent API: kvs") @@ -698,8 +699,8 @@ m2 (#'slf4j/est-marker! "M2") cm (#'slf4j/est-marker! "Compound" "M1" "M2")] - [(is (sm? (with-sig (.info sl cm "Hello")) {:data #:slf4j{:marker-names #{"Compound" "M1" "M2"}}}) "Legacy API: markers") - (is (sm? (with-sig (-> (.atInfo sl) (.addMarker m1) (.addMarker cm) (.log))) {:data #:slf4j{:marker-names #{"Compound" "M1" "M2"}}}) "Fluent API: markers")])) + [(is (sm? (with-sig (.info sl cm "Hello")) {:data {:slf4j/marker-names #{"Compound" "M1" "M2"}}}) "Legacy API: markers") + (is (sm? (with-sig (-> (.atInfo sl) (.addMarker m1) (.addMarker cm) (.log))) {:data {:slf4j/marker-names #{"Compound" "M1" "M2"}}}) "Fluent API: markers")])) (testing "Errors" [(is (sm? (with-sig (.warn sl "An error" ^Throwable ex1)) {:level :warn, :error pex1?}) "Legacy API: errors") diff --git a/projects/slf4j/project.clj b/projects/slf4j/project.clj index 5366b9c..090bb03 100644 --- a/projects/slf4j/project.clj +++ b/projects/slf4j/project.clj @@ -16,7 +16,7 @@ :profiles {:provided {:dependencies - [[org.clojure/clojure "1.11.4"] + [[org.clojure/clojure "1.12.0"] [org.slf4j/slf4j-api "2.0.16"] [com.taoensso/telemere "1.0.0-SNAPSHOT"]]} diff --git a/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLogger.java b/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLogger.java index b380d94..9fbd002 100644 --- a/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLogger.java +++ b/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLogger.java @@ -52,10 +52,10 @@ public class TelemereLogger extends LegacyAbstractLogger implements LoggingEvent private static IFn isAllowedFn; static void init() { - IFn requireFn = Clojure.var("clojure.core", "require"); - requireFn.invoke(Clojure.read("taoensso.telemere.slf4j")); - isAllowedFn = Clojure.var("taoensso.telemere.slf4j", "allowed?"); - logFn = Clojure.var("taoensso.telemere.slf4j", "log!"); + IFn requireFn = Clojure.var("clojure.core", "require"); + requireFn.invoke(Clojure.read("taoensso.telemere.slf4j")); + isAllowedFn = Clojure.var("taoensso.telemere.slf4j", "allowed?"); + logFn = Clojure.var("taoensso.telemere.slf4j", "log!"); } protected TelemereLogger(String name) { this.name = name; } @@ -72,7 +72,7 @@ public class TelemereLogger extends LegacyAbstractLogger implements LoggingEvent @Override protected String getFullyQualifiedCallerName() { return null; } @Override protected void handleNormalizedLoggingCall(Level level, Marker marker, String messagePattern, Object[] arguments, Throwable throwable) { - logFn.invoke(this.name, level, throwable, messagePattern, arguments, marker); // Legacy API, called after level check + logFn.invoke(this.name, level, throwable, messagePattern, arguments, marker); // Legacy API, called after level check } } diff --git a/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLoggerFactory.java b/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLoggerFactory.java index 55f63e8..0455511 100644 --- a/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLoggerFactory.java +++ b/projects/slf4j/src/java/com/taoensso/telemere/slf4j/TelemereLoggerFactory.java @@ -40,15 +40,7 @@ public class TelemereLoggerFactory implements ILoggerFactory { TelemereLogger.lazyInit(); } - public Logger getLogger(String name) { - return loggerMap.computeIfAbsent(name, this::createLogger); - } - - protected Logger createLogger(String name) { - return new TelemereLogger(name); - } - - protected void reset() { - loggerMap.clear(); - } + public Logger getLogger(String name) { return loggerMap.computeIfAbsent(name, this::createLogger); } + protected Logger createLogger(String name) { return new TelemereLogger(name); } + protected void reset() { loggerMap.clear(); } } diff --git a/projects/slf4j/src/taoensso/telemere/slf4j.clj b/projects/slf4j/src/taoensso/telemere/slf4j.clj index ceb8c31..adee5c5 100644 --- a/projects/slf4j/src/taoensso/telemere/slf4j.clj +++ b/projects/slf4j/src/taoensso/telemere/slf4j.clj @@ -1,5 +1,5 @@ (ns taoensso.telemere.slf4j - "Interop support for SLF4J -> Telemere. + "Interop support for SLF4Jv2 -> Telemere. Telemere will attempt to load this ns automatically when possible. To use Telemere as your SLF4J backend/provider, just include the @@ -16,6 +16,7 @@ - SLF4J uses standard `ServiceLoader` mechanism to find its logging backend, searches for `SLF4JServiceProvider` provider on classpath." + {:author "Peter Taoussanis (@ptaoussanis)"} (:require [taoensso.encore :as enc :refer [have have?]] [taoensso.telemere.impl :as impl]) @@ -40,7 +41,7 @@ org.slf4j.event.EventConstants/ERROR_INT :error (throw (ex-info "Unexpected `org.slf4j.event.Level`" - {:level {:value level, :type (type level)}})))) + {:level (enc/typed-val level)})))) (comment (enc/qb 1e6 (sig-level org.slf4j.event.Level/INFO))) ; 36.47 @@ -100,8 +101,7 @@ ;;;; Interop fns (called by `TelemereLogger`) (defn- allowed? - "Private, don't use. - Called by `com.taoensso.telemere.slf4j.TelemereLogger`." + "Called by `com.taoensso.telemere.slf4j.TelemereLogger`." [logger-name level] (when-debug (println [:slf4j/allowed? (sig-level level) logger-name])) (impl/signal-allowed? @@ -137,8 +137,7 @@ nil) (defn- log! - "Private, don't use. - Called by `com.taoensso.telemere.slf4j.TelemereLogger`." + "Called by `com.taoensso.telemere.slf4j.TelemereLogger`." ;; Modern "fluent" API calls ([logger-name ^org.slf4j.event.LoggingEvent event]