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))))