From ac25275ffc367c13702445883889456cbafd8737 Mon Sep 17 00:00:00 2001 From: Cam Saul <cammsaul@gmail.com> Date: Tue, 2 Apr 2019 19:21:20 -0700 Subject: [PATCH] Use reify to define the Metabase logging appender; fix build errors --- project.clj | 6 ++--- resources/log4j.properties | 2 -- src/metabase/api/util.clj | 2 +- src/metabase/logger.clj | 50 +++++++++++++++++--------------------- 4 files changed, 25 insertions(+), 35 deletions(-) diff --git a/project.clj b/project.clj index b225ea7ffda..9159a2985b1 100644 --- a/project.clj +++ b/project.clj @@ -151,15 +151,13 @@ :env {:mb-run-mode "dev"} :jvm-opts ["-Dlogfile.path=target/log"] ;; Log appender class needs to be compiled for log4j to use it. Same with the Quartz class load helper - :aot [metabase.logger - metabase.task.DynamicClassLoadHelper]} + :aot [metabase.task.DynamicClassLoadHelper]} :ci {:jvm-opts ["-Xmx2500m"]} :install - {:aot [metabase.logger - metabase.task.DynamicClassLoadHelper]} + {:aot [metabase.task.DynamicClassLoadHelper]} :install-for-building-drivers {:auto-clean true diff --git a/resources/log4j.properties b/resources/log4j.properties index d0b2c7b0c87..2ba0837e28f 100644 --- a/resources/log4j.properties +++ b/resources/log4j.properties @@ -14,8 +14,6 @@ log4j.appender.file.MaxBackupIndex=2 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d [%t] %-5p%c - %m%n -log4j.appender.metabase=metabase.logger.Appender - # customizations to logging by package log4j.logger.metabase.driver=INFO log4j.logger.metabase.plugins=DEBUG diff --git a/src/metabase/api/util.clj b/src/metabase/api/util.clj index 16b74b33bd0..6f8c6c14df3 100644 --- a/src/metabase/api/util.clj +++ b/src/metabase/api/util.clj @@ -19,7 +19,7 @@ "Logs." [] (api/check-superuser) - (logger/get-messages)) + (logger/messages)) (api/defendpoint GET "/stats" "Anonymous usage stats. Endpoint for testing, and eventually exposing this to instance admins to let them see diff --git a/src/metabase/logger.clj b/src/metabase/logger.clj index 9adf286d416..70cb740d4f3 100644 --- a/src/metabase/logger.clj +++ b/src/metabase/logger.clj @@ -1,25 +1,21 @@ (ns metabase.logger - (:gen-class - :extends org.apache.log4j.AppenderSkeleton - :name metabase.logger.Appender) (:require [amalloy.ring-buffer :refer [ring-buffer]] [clj-time [coerce :as coerce] [core :as t] [format :as time]] [clojure.string :as str]) - (:import org.apache.log4j.spi.LoggingEvent)) + (:import [org.apache.log4j Appender AppenderSkeleton Logger] + org.apache.log4j.spi.LoggingEvent)) (def ^:private ^:const max-log-entries 2500) -(defonce ^:private messages (atom (ring-buffer max-log-entries))) +(defonce ^:private messages* (atom (ring-buffer max-log-entries))) -;; TODO - rename to `messages` -(defn get-messages +(defn messages "Get the list of currently buffered log entries, from most-recent to oldest." [] - (reverse (seq @messages))) - + (reverse (seq @messages*))) (defonce ^:private formatter (time/formatter "MMM dd HH:mm:ss" (t/default-time-zone))) @@ -36,22 +32,20 @@ (format "%s \033[1m%s %s\033[0m :: %s" ts level fqns msg)) (seq (.getThrowableStrRep event))))) -(defn -append - "Append a new EVENT to the `messages` atom. - [Overrides an `AppenderSkeleton` - method](http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/AppenderSkeleton.html#append(org.apache.log4j.spi.LoggingEvent))" - [_, ^LoggingEvent event] - (swap! messages conj (event->log-string event)) - nil) - -(defn -close - "No-op if something tries to close this logging appender. - [Overrides an `Appender` method](http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html#close())" - [_] - nil) - -(defn -requiresLayout - "The MB logger doesn't require a layout. - [Overrides an `Appender` method](http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html#getLayout())" - [_] - false) + +(defn- metabase-appender ^Appender [] + (proxy [AppenderSkeleton] [] + (append [event] + (swap! messages* conj (event->log-string event)) + nil) + (close [] + nil) + (requiresLayout [] + false))) + +(defonce ^:private has-added-appender? (atom false)) + +(when-not *compile-files* + (when-not @has-added-appender? + (reset! has-added-appender? true) + (.addAppender (Logger/getRootLogger) (metabase-appender)))) -- GitLab