Merge "Use existing gc LOG_NAME constant"
diff --git a/gerrit-pgm/BUCK b/gerrit-pgm/BUCK
index a968ef4..67a0ead 100644
--- a/gerrit-pgm/BUCK
+++ b/gerrit-pgm/BUCK
@@ -112,6 +112,7 @@
     '//lib:h2',
     '//lib:servlet-api-3_1',
     '//lib/guice:guice',
+    '//lib/guice:guice-assistedinject',
     '//lib/guice:guice-servlet',
     '//lib/jetty:server',
     '//lib/jetty:servlet',
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
index 03b5a55..ba97d4a 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/HttpLog.java
@@ -16,31 +16,28 @@
 
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.LogUtil;
+import com.google.gerrit.server.util.SystemLog;
 import com.google.gerrit.server.util.TimeUtil;
+import com.google.inject.Inject;
 
-import org.apache.log4j.Appender;
 import org.apache.log4j.AsyncAppender;
-import org.apache.log4j.DailyRollingFileAppender;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
-import org.apache.log4j.spi.ErrorHandler;
 import org.apache.log4j.spi.LoggingEvent;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.RequestLog;
 import org.eclipse.jetty.server.Response;
 import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.eclipse.jgit.lib.Config;
-
-import java.io.File;
-import java.io.IOException;
 
 /** Writes the {@code httpd_log} file with per-request data. */
 class HttpLog extends AbstractLifeCycle implements RequestLog {
   private static final Logger log = Logger.getLogger(HttpLog.class);
   private static final String LOG_NAME = "httpd_log";
 
+  interface HttpLogFactory {
+    HttpLog get();
+  }
+
   protected static final String P_HOST = "Host";
   protected static final String P_USER = "User";
   protected static final String P_METHOD = "Method";
@@ -53,35 +50,9 @@
 
   private final AsyncAppender async;
 
-  HttpLog(final SitePaths site, final Config config) {
-    async = new AsyncAppender();
-    async.setBlocking(true);
-    async.setBufferSize(config.getInt("core", "asyncLoggingBufferSize", 64));
-    async.setLocationInfo(false);
-    if (LogUtil.shouldConfigureLogSystem()) {
-      final DailyRollingFileAppender dst = new DailyRollingFileAppender();
-      dst.setName(LOG_NAME);
-      dst.setLayout(new HttpLogLayout());
-      dst.setEncoding("UTF-8");
-      dst.setFile(new File(resolve(site.logs_dir), LOG_NAME).getPath());
-      dst.setImmediateFlush(true);
-      dst.setAppend(true);
-      dst.setThreshold(Level.INFO);
-      dst.setErrorHandler(new DieErrorHandler());
-      dst.activateOptions();
-      dst.setErrorHandler(new LogLogHandler());
-      async.addAppender(dst);
-    } else {
-      Appender appender = log.getAppender(LOG_NAME);
-      if (appender != null) {
-        async.addAppender(appender);
-      } else {
-        log.warn("No appender with the name: "
-            + LOG_NAME
-            + " was found. HTTPD logging is disabled");
-      }
-    }
-    async.activateOptions();
+  @Inject
+  HttpLog(final SystemLog systemLog) {
+    async = systemLog.createAsyncAppender(LOG_NAME, new HttpLogLayout());
   }
 
   @Override
@@ -151,80 +122,4 @@
       event.setProperty(key, String.valueOf(val));
     }
   }
-
-  private static File resolve(final File logs_dir) {
-    try {
-      return logs_dir.getCanonicalFile();
-    } catch (IOException e) {
-      return logs_dir.getAbsoluteFile();
-    }
-  }
-
-  private static final class DieErrorHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message) {
-      throw new RuntimeException("Cannot open log file: " + message);
-    }
-
-    @Override
-    public void activateOptions() {
-    }
-
-    @Override
-    public void setAppender(Appender appender) {
-    }
-
-    @Override
-    public void setBackupAppender(Appender appender) {
-    }
-
-    @Override
-    public void setLogger(Logger logger) {
-    }
-  }
-
-  private static final class LogLogHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
-      log.error(message, e);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      log.error(message, e);
-    }
-
-    @Override
-    public void error(String message) {
-      log.error(message);
-    }
-
-    @Override
-    public void activateOptions() {
-    }
-
-    @Override
-    public void setAppender(Appender appender) {
-    }
-
-    @Override
-    public void setBackupAppender(Appender appender) {
-    }
-
-    @Override
-    public void setLogger(Logger logger) {
-    }
-  }
 }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java
index b563349..d356d96 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyModule.java
@@ -15,6 +15,8 @@
 package com.google.gerrit.pgm.http.jetty;
 
 import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.pgm.http.jetty.HttpLog.HttpLogFactory;
+import com.google.inject.assistedinject.FactoryModuleBuilder;
 
 public class JettyModule extends LifecycleModule {
   private final JettyEnv env;
@@ -28,5 +30,6 @@
     bind(JettyEnv.class).toInstance(env);
     bind(JettyServer.class);
     listener().to(JettyServer.Lifecycle.class);
+    install(new FactoryModuleBuilder().build(HttpLogFactory.class));
   }
 }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
index a98b564..1d6d2bb 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/http/jetty/JettyServer.java
@@ -25,6 +25,7 @@
 import com.google.common.io.ByteStreams;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.launcher.GerritLauncher;
+import com.google.gerrit.pgm.http.jetty.HttpLog.HttpLogFactory;
 import com.google.gerrit.reviewdb.client.AuthType;
 import com.google.gerrit.server.config.ConfigUtil;
 import com.google.gerrit.server.config.GerritServerConfig;
@@ -160,7 +161,7 @@
 
   @Inject
   JettyServer(@GerritServerConfig final Config cfg, final SitePaths site,
-      final JettyEnv env)
+      final JettyEnv env, final HttpLogFactory httpLogFactory)
       throws MalformedURLException, IOException {
     this.site = site;
 
@@ -170,7 +171,7 @@
     Handler app = makeContext(env, cfg);
     if (cfg.getBoolean("httpd", "requestLog", !reverseProxy)) {
       RequestLogHandler handler = new RequestLogHandler();
-      handler.setRequestLog(new HttpLog(site, cfg));
+      handler.setRequestLog(httpLogFactory.get());
       handler.setHandler(app);
       app = handler;
     }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
index 05c8f09..a766d1e 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
@@ -17,22 +17,16 @@
 import com.google.gerrit.common.Die;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.util.LogUtil;
+import com.google.gerrit.server.util.SystemLog;
 
-import org.apache.log4j.Appender;
 import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.DailyRollingFileAppender;
 import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
-import org.apache.log4j.helpers.OnlyOnceErrorHandler;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.LoggingEvent;
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.IOException;
 
 public class ErrorLogFile {
   static final String LOG_NAME = "error_log";
@@ -59,7 +53,7 @@
     if (!logdir.exists() && !logdir.mkdirs()) {
       throw new Die("Cannot create log directory: " + logdir);
     }
-    if (LogUtil.shouldConfigureLogSystem()) {
+    if (SystemLog.shouldConfigure()) {
       initLogSystem(logdir);
     }
 
@@ -76,68 +70,9 @@
   }
 
   private static void initLogSystem(final File logdir) {
-    final PatternLayout layout = new PatternLayout();
-    layout.setConversionPattern("[%d] %-5p %c %x: %m%n");
-
-    final DailyRollingFileAppender dst = new DailyRollingFileAppender();
-    dst.setName(LOG_NAME);
-    dst.setLayout(layout);
-    dst.setEncoding("UTF-8");
-    dst.setFile(new File(resolve(logdir), LOG_NAME).getPath());
-    dst.setImmediateFlush(true);
-    dst.setAppend(true);
-    dst.setThreshold(Level.INFO);
-    dst.setErrorHandler(new DieErrorHandler());
-    dst.activateOptions();
-    dst.setErrorHandler(new OnlyOnceErrorHandler());
-
     final Logger root = LogManager.getRootLogger();
     root.removeAllAppenders();
-    root.addAppender(dst);
-  }
-
-  private static File resolve(final File logs_dir) {
-    try {
-      return logs_dir.getCanonicalFile();
-    } catch (IOException e) {
-      return logs_dir.getAbsoluteFile();
-    }
-  }
-
-  private ErrorLogFile() {
-  }
-
-  private static final class DieErrorHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message) {
-      throw new Die("Cannot open log file: " + message);
-    }
-
-    @Override
-    public void activateOptions() {
-    }
-
-    @Override
-    public void setAppender(Appender appender) {
-    }
-
-    @Override
-    public void setBackupAppender(Appender appender) {
-    }
-
-    @Override
-    public void setLogger(Logger logger) {
-    }
+    root.addAppender(SystemLog.createAppender(logdir, LOG_NAME,
+        new PatternLayout("[%d] %-5p %c %x: %m%n")));
   }
 }
diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
index 5cdf435..7d33a36 100644
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
+++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/GarbageCollectionLogFile.java
@@ -18,25 +18,16 @@
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.gerrit.server.git.GarbageCollection;
-import com.google.gerrit.server.util.LogUtil;
+import com.google.gerrit.server.util.SystemLog;
 
-import org.apache.log4j.Appender;
-import org.apache.log4j.DailyRollingFileAppender;
-import org.apache.log4j.Level;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
-import org.apache.log4j.helpers.OnlyOnceErrorHandler;
-import org.apache.log4j.spi.ErrorHandler;
-import org.apache.log4j.spi.LoggingEvent;
-import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.IOException;
 
 public class GarbageCollectionLogFile {
-  private static final org.slf4j.Logger log = LoggerFactory.getLogger(GarbageCollectionLogFile.class);
 
   public static LifecycleListener start(File sitePath)
       throws FileNotFoundException {
@@ -44,7 +35,7 @@
     if (!logdir.exists() && !logdir.mkdirs()) {
       throw new Die("Cannot create log directory: " + logdir);
     }
-    if (LogUtil.shouldConfigureLogSystem()) {
+    if (SystemLog.shouldConfigure()) {
       initLogSystem(logdir);
     }
 
@@ -61,70 +52,10 @@
   }
 
   private static void initLogSystem(File logdir) {
-    PatternLayout layout = new PatternLayout();
-    layout.setConversionPattern("[%d] %-5p %x: %m%n");
-
-    DailyRollingFileAppender dst = new DailyRollingFileAppender();
-    dst.setName(GarbageCollection.LOG_NAME);
-    dst.setLayout(layout);
-    dst.setEncoding("UTF-8");
-    dst.setFile(new File(resolve(logdir), GarbageCollection.LOG_NAME).getPath());
-    dst.setImmediateFlush(true);
-    dst.setAppend(true);
-    dst.setThreshold(Level.INFO);
-    dst.setErrorHandler(new LogErrorHandler());
-    dst.activateOptions();
-    dst.setErrorHandler(new OnlyOnceErrorHandler());
-
     Logger gcLogger = LogManager.getLogger(GarbageCollection.LOG_NAME);
     gcLogger.removeAllAppenders();
-    gcLogger.addAppender(dst);
+    gcLogger.addAppender(SystemLog.createAppender(logdir,
+        GarbageCollection.LOG_NAME, new PatternLayout("[%d] %-5p %x: %m%n")));
     gcLogger.setAdditivity(false);
   }
-
-  private static File resolve(File logs_dir) {
-    try {
-      return logs_dir.getCanonicalFile();
-    } catch (IOException e) {
-      return logs_dir.getAbsoluteFile();
-    }
-  }
-
-  private GarbageCollectionLogFile() {
-  }
-
-  private static final class LogErrorHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message) {
-      log.error("Cannot open '" + GarbageCollection.LOG_NAME + "' log file: "
-          + message);
-    }
-
-    @Override
-    public void activateOptions() {
-    }
-
-    @Override
-    public void setAppender(Appender appender) {
-    }
-
-    @Override
-    public void setBackupAppender(Appender appender) {
-    }
-
-    @Override
-    public void setLogger(Logger logger) {
-    }
-  }
 }
diff --git a/gerrit-server/BUCK b/gerrit-server/BUCK
index a6a13ef..e045782 100644
--- a/gerrit-server/BUCK
+++ b/gerrit-server/BUCK
@@ -62,6 +62,7 @@
     '//lib/jgit:jgit-archive',
     '//lib/joda:joda-time',
     '//lib/log:api',
+    '//lib/log:log4j',
     '//lib/prolog:prolog-cafe',
     '//lib/lucene:analyzers-common',
     '//lib/lucene:core',
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/LogUtil.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/LogUtil.java
deleted file mode 100644
index ba39a26..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/LogUtil.java
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.server.util;
-
-import com.google.common.base.Strings;
-
-public class LogUtil {
-
-  private static final String LOG4J_CONFIGURATION = "log4j.configuration";
-
-  public static boolean shouldConfigureLogSystem() {
-    return Strings.isNullOrEmpty(System.getProperty(LOG4J_CONFIGURATION));
-  }
-}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
new file mode 100644
index 0000000..20e7b04
--- /dev/null
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
@@ -0,0 +1,136 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.gerrit.server.util;
+
+import com.google.common.base.Strings;
+import com.google.gerrit.common.Die;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+import org.apache.log4j.Appender;
+import org.apache.log4j.AsyncAppender;
+import org.apache.log4j.DailyRollingFileAppender;
+import org.apache.log4j.Layout;
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.helpers.OnlyOnceErrorHandler;
+import org.apache.log4j.spi.ErrorHandler;
+import org.apache.log4j.spi.LoggingEvent;
+import org.eclipse.jgit.lib.Config;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+
+@Singleton
+public class SystemLog {
+
+  private static final org.slf4j.Logger log = LoggerFactory
+      .getLogger(SystemLog.class);
+  private static final String LOG4J_CONFIGURATION = "log4j.configuration";
+  private final SitePaths site;
+  private final Config config;
+
+  @Inject
+  public SystemLog(final SitePaths site, @GerritServerConfig Config config) {
+    this.site = site;
+    this.config = config;
+  }
+
+  public static boolean shouldConfigure() {
+    return Strings.isNullOrEmpty(System.getProperty(LOG4J_CONFIGURATION));
+  }
+
+  public static Appender createAppender(File logdir, String name, Layout layout) {
+    final DailyRollingFileAppender dst = new DailyRollingFileAppender();
+    dst.setName(name);
+    dst.setLayout(layout);
+    dst.setEncoding("UTF-8");
+    dst.setFile(new File(resolve(logdir), name).getPath());
+    dst.setImmediateFlush(true);
+    dst.setAppend(true);
+    dst.setThreshold(Level.INFO);
+    dst.setErrorHandler(new DieErrorHandler());
+    dst.activateOptions();
+    dst.setErrorHandler(new OnlyOnceErrorHandler());
+    return dst;
+  }
+
+  public AsyncAppender createAsyncAppender(String name, Layout layout) {
+    AsyncAppender async = new AsyncAppender();
+    async.setBlocking(true);
+    async.setBufferSize(config.getInt("core", "asyncLoggingBufferSize", 64));
+    async.setLocationInfo(false);
+
+    if (shouldConfigure()) {
+      async.addAppender(createAppender(site.logs_dir, name, layout));
+    } else {
+      Appender appender = LogManager.getLogger(name).getAppender(name);
+      if (appender != null) {
+        async.addAppender(appender);
+      } else {
+        log.warn("No appender with the name: " + name + " was found. " + name
+            + " logging is disabled");
+      }
+    }
+    async.activateOptions();
+    return async;
+  }
+
+  private static File resolve(final File logs_dir) {
+    try {
+      return logs_dir.getCanonicalFile();
+    } catch (IOException e) {
+      return logs_dir.getAbsoluteFile();
+    }
+  }
+
+  private static final class DieErrorHandler implements ErrorHandler {
+    @Override
+    public void error(String message, Exception e, int errorCode,
+        LoggingEvent event) {
+      error(e != null ? e.getMessage() : message);
+    }
+
+    @Override
+    public void error(String message, Exception e, int errorCode) {
+      error(e != null ? e.getMessage() : message);
+    }
+
+    @Override
+    public void error(String message) {
+      throw new Die("Cannot open log file: " + message);
+    }
+
+    @Override
+    public void activateOptions() {
+    }
+
+    @Override
+    public void setAppender(Appender appender) {
+    }
+
+    @Override
+    public void setBackupAppender(Appender appender) {
+    }
+
+    @Override
+    public void setLogger(Logger logger) {
+    }
+  }
+}
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
index 3e6dc97..d8f2002 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshLog.java
@@ -23,27 +23,20 @@
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.PeerDaemonUser;
 import com.google.gerrit.server.config.GerritServerConfig;
-import com.google.gerrit.server.config.SitePaths;
 import com.google.gerrit.server.util.IdGenerator;
-import com.google.gerrit.server.util.LogUtil;
+import com.google.gerrit.server.util.SystemLog;
 import com.google.gerrit.server.util.TimeUtil;
 import com.google.gerrit.sshd.SshScope.Context;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
-import org.apache.log4j.Appender;
 import org.apache.log4j.AsyncAppender;
-import org.apache.log4j.DailyRollingFileAppender;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
-import org.apache.log4j.spi.ErrorHandler;
 import org.apache.log4j.spi.LoggingEvent;
 import org.eclipse.jgit.lib.Config;
 
-import java.io.File;
-import java.io.IOException;
-
 @Singleton
 class SshLog implements LifecycleListener {
   private static final Logger log = Logger.getLogger(SshLog.class);
@@ -62,7 +55,8 @@
 
   @Inject
   SshLog(final Provider<SshSession> session, final Provider<Context> context,
-      final SitePaths site, @GerritServerConfig Config config, AuditService auditService) {
+      SystemLog systemLog, @GerritServerConfig Config config,
+      AuditService auditService) {
     this.session = session;
     this.context = context;
     this.auditService = auditService;
@@ -71,36 +65,7 @@
       async = null;
       return;
     }
-
-    async = new AsyncAppender();
-    async.setBlocking(true);
-    async.setBufferSize(config.getInt("core", "asyncLoggingBufferSize", 64));
-    async.setLocationInfo(false);
-
-    if (LogUtil.shouldConfigureLogSystem()) {
-      final DailyRollingFileAppender dst = new DailyRollingFileAppender();
-      dst.setName(LOG_NAME);
-      dst.setLayout(new SshLogLayout());
-      dst.setEncoding("UTF-8");
-      dst.setFile(new File(resolve(site.logs_dir), LOG_NAME).getPath());
-      dst.setImmediateFlush(true);
-      dst.setAppend(true);
-      dst.setThreshold(Level.INFO);
-      dst.setErrorHandler(new DieErrorHandler());
-      dst.activateOptions();
-      dst.setErrorHandler(new LogLogHandler());
-      async.addAppender(dst);
-    } else {
-      Appender appender = log.getAppender(LOG_NAME);
-      if (appender != null) {
-        async.addAppender(appender);
-      } else {
-        log.warn("No appender with the name: "
-            + LOG_NAME
-            + " was found. SSHD logging is disabled");
-      }
-    }
-    async.activateOptions();
+    async = systemLog.createAsyncAppender(LOG_NAME, new SshLogLayout());
   }
 
   @Override
@@ -276,82 +241,6 @@
     return IdGenerator.format(id);
   }
 
-  private static File resolve(final File logs_dir) {
-    try {
-      return logs_dir.getCanonicalFile();
-    } catch (IOException e) {
-      return logs_dir.getAbsoluteFile();
-    }
-  }
-
-  private static final class DieErrorHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      error(e != null ? e.getMessage() : message);
-    }
-
-    @Override
-    public void error(String message) {
-      throw new RuntimeException("Cannot open log file: " + message);
-    }
-
-    @Override
-    public void activateOptions() {
-    }
-
-    @Override
-    public void setAppender(Appender appender) {
-    }
-
-    @Override
-    public void setBackupAppender(Appender appender) {
-    }
-
-    @Override
-    public void setLogger(Logger logger) {
-    }
-  }
-
-  private static final class LogLogHandler implements ErrorHandler {
-    @Override
-    public void error(String message, Exception e, int errorCode,
-        LoggingEvent event) {
-      log.error(message, e);
-    }
-
-    @Override
-    public void error(String message, Exception e, int errorCode) {
-      log.error(message, e);
-    }
-
-    @Override
-    public void error(String message) {
-      log.error(message);
-    }
-
-    @Override
-    public void activateOptions() {
-    }
-
-    @Override
-    public void setAppender(Appender appender) {
-    }
-
-    @Override
-    public void setBackupAppender(Appender appender) {
-    }
-
-    @Override
-    public void setLogger(Logger logger) {
-    }
-  }
-
   void audit(Context ctx, Object result, String cmd) {
     final String sid = extractSessionId(ctx);
     final long created = extractCreated(ctx);