diff --git a/project.clj b/project.clj index b225ea7ffda2065815978a97a586b331387de48b..9159a2985b1a71ac06ad1771ba4d4962598b9e0a 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 d0b2c7b0c8738195a33fea8ac0406ca5ab656b30..2ba0837e28f20c90d51b51f835bac05bc2b04fdf 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 16b74b33bd0a6d91aac13fa92c277b06b010b308..6f8c6c14df3615ae48202b91e4b811fe83067039 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 9adf286d416bf9020fbea3a52b8314a829f4220e..70cb740d4f3dcf61fa112c84c5e35b1be4ea2aa7 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))))