Merge branch 'stable-3.0' into stable-3.1

* stable-3.0:
  ReplicationQueue: Revert back from Flogger to slf4j logging

Change-Id: I05d565e2d45154f72b8efed6579a10bca892de9d
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/CreateProjectTask.java b/src/main/java/com/googlesource/gerrit/plugins/replication/CreateProjectTask.java
index 424648e..fa26e82 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/CreateProjectTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/CreateProjectTask.java
@@ -63,8 +63,7 @@
       return true;
     }
 
-    repLog.atWarning().log(
-        "Cannot create new project %s on remote site %s.", projectName, replicateURI);
+    repLog.warn("Cannot create new project {} on remote site {}.", projectName, replicateURI);
     return false;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/DeleteProjectTask.java b/src/main/java/com/googlesource/gerrit/plugins/replication/DeleteProjectTask.java
index 8ea7227..4617672 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/DeleteProjectTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/DeleteProjectTask.java
@@ -55,7 +55,7 @@
       return;
     }
 
-    repLog.atWarning().log("Cannot delete project %s on remote site %s.", project, replicateURI);
+    repLog.warn("Cannot delete project {} on remote site {}.", project, replicateURI);
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
index 79cddca..0d3939a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
@@ -51,7 +51,6 @@
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.util.RequestContext;
-import com.google.gerrit.util.logging.NamedFluentLogger;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Provider;
@@ -82,9 +81,10 @@
 import org.eclipse.jgit.transport.RemoteConfig;
 import org.eclipse.jgit.transport.RemoteRefUpdate;
 import org.eclipse.jgit.transport.URIish;
+import org.slf4j.Logger;
 
 public class Destination {
-  private static final NamedFluentLogger repLog = ReplicationQueue.repLog;
+  private static final Logger repLog = ReplicationQueue.repLog;
 
   private static final String PROJECT_NOT_AVAILABLE = "source project %s not available";
 
@@ -156,7 +156,7 @@
           builder.add(g.getUUID());
           addRecursiveParents(g.getUUID(), builder, groupIncludeCache);
         } else {
-          repLog.atWarning().log("Group \"%s\" not recognized, removing from authGroup", name);
+          repLog.warn("Group \"{}\" not recognized, removing from authGroup", name);
         }
       }
       remoteUser = new RemoteSiteUser(new ListGroupMembership(builder.build()));
@@ -240,9 +240,11 @@
         int numInFlight = inFlight.size();
 
         if (numPending > 0 || numInFlight > 0) {
-          repLog.atWarning().log(
-              "Cancelling replication events (pending=%d, inFlight=%d) for destination %s",
-              numPending, numInFlight, getRemoteConfigName());
+          repLog.warn(
+              "Cancelling replication events (pending={}, inFlight={}) for destination {}",
+              numPending,
+              numInFlight,
+              getRemoteConfigName());
 
           foreachPushOp(
               pending,
@@ -278,8 +280,7 @@
     if (!config.replicateHiddenProjects()
         && state.getProject().getState()
             == com.google.gerrit.extensions.client.ProjectState.HIDDEN) {
-      repLog.atFine().log(
-          "Project %s is hidden and replication of hidden projects is disabled", name);
+      repLog.debug("Project {} is hidden and replication of hidden projects is disabled", name);
       return false;
     }
 
@@ -292,9 +293,10 @@
       permissionBackend.user(user).project(state.getNameKey()).check(permissionToCheck);
       return true;
     } catch (AuthException e) {
-      repLog.atFine().log(
-          "Project %s is not visible to current user %s",
-          name, user.getUserName().orElse("unknown"));
+      repLog.debug(
+          "Project {} is not visible to current user {}",
+          name,
+          user.getUserName().orElse("unknown"));
       return false;
     }
   }
@@ -309,20 +311,19 @@
                 try {
                   projectState = projectCache.checkedGet(project);
                 } catch (IOException e) {
-                  repLog.atWarning().withCause(e).log(
-                      "Error reading project %s from cache", project);
+                  repLog.warn("Error reading project {} from cache", project, e);
                   return false;
                 }
                 if (projectState == null) {
-                  repLog.atFine().log("Project %s does not exist", project);
+                  repLog.debug("Project {} does not exist", project);
                   throw new NoSuchProjectException(project);
                 }
                 if (!projectState.statePermitsRead()) {
-                  repLog.atFine().log("Project %s does not permit read", project);
+                  repLog.debug("Project {} does not permit read", project);
                   return false;
                 }
                 if (!shouldReplicate(projectState, userProvider.get())) {
-                  repLog.atFine().log("Project %s should not be replicated", project);
+                  repLog.debug("Project {} should not be replicated", project);
                   return false;
                 }
                 if (PushOne.ALL_REFS.equals(ref)) {
@@ -335,9 +336,11 @@
                       .ref(ref)
                       .check(RefPermission.READ);
                 } catch (AuthException e) {
-                  repLog.atFine().log(
-                      "Ref %s on project %s is not visible to calling user",
-                      ref, project, userProvider.get().getUserName().orElse("unknown"));
+                  repLog.debug(
+                      "Ref {} on project {} is not visible to calling user {}",
+                      ref,
+                      project,
+                      userProvider.get().getUserName().orElse("unknown"));
                   return false;
                 }
                 return true;
@@ -385,10 +388,10 @@
   void schedule(
       Project.NameKey project, String ref, URIish uri, ReplicationState state, boolean now) {
     if (!shouldReplicate(project, ref, state)) {
-      repLog.atFine().log("Not scheduling replication %s:%s => %s", project, ref, uri);
+      repLog.debug("Not scheduling replication {}:{} => {}", project, ref, uri);
       return;
     }
-    repLog.atInfo().log("scheduling replication %s:%s => %s", project, ref, uri);
+    repLog.info("scheduling replication {}:{} => {}", project, ref, uri);
 
     if (!config.replicatePermissions()) {
       PushOne e;
@@ -430,8 +433,7 @@
         task.addState(ref, state);
       }
       state.increasePushTaskCount(project.get(), ref);
-      repLog.atInfo().log(
-          "scheduled %s:%s => %s to run after %ds", project, ref, task, config.getDelay());
+      repLog.info("scheduled {}:{} => {} to run after {}s", project, ref, task, config.getDelay());
     }
   }
 
@@ -595,7 +597,7 @@
 
   boolean wouldPushProject(Project.NameKey project) {
     if (!shouldReplicate(project)) {
-      repLog.atFine().log("Skipping replication of project %s", project.get());
+      repLog.debug("Skipping replication of project {}", project.get());
       return false;
     }
 
@@ -607,8 +609,7 @@
 
     boolean matches = (new ReplicationFilter(projects)).matches(project);
     if (!matches) {
-      repLog.atFine().log(
-          "Skipping replication of project %s; does not match filter", project.get());
+      repLog.debug("Skipping replication of project {}; does not match filter", project.get());
     }
     return matches;
   }
@@ -619,7 +620,7 @@
 
   boolean wouldPushRef(String ref) {
     if (!config.replicatePermissions() && RefNames.REFS_CONFIG.equals(ref)) {
-      repLog.atFine().log("Skipping push of ref %s; it is a meta ref", ref);
+      repLog.debug("Skipping push of ref {}; it is a meta ref", ref);
       return false;
     }
     if (PushOne.ALL_REFS.equals(ref)) {
@@ -630,7 +631,7 @@
         return true;
       }
     }
-    repLog.atFine().log("Skipping push of ref %s; it does not match push ref specs", ref);
+    repLog.debug("Skipping push of ref {}; it does not match push ref specs", ref);
     return false;
   }
 
@@ -662,8 +663,7 @@
         } else if (remoteNameStyle.equals("basenameOnly")) {
           name = FilenameUtils.getBaseName(name);
         } else if (!remoteNameStyle.equals("slash")) {
-          repLog.atFine().log(
-              "Unknown remoteNameStyle: %s, falling back to slash", remoteNameStyle);
+          repLog.debug("Unknown remoteNameStyle: {}, falling back to slash", remoteNameStyle);
         }
         String replacedPath = replaceName(uri.getPath(), name, config.isSingleProjectMatch());
         if (replacedPath != null) {
@@ -755,7 +755,7 @@
       try {
         eventDispatcher.get().postEvent(BranchNameKey.create(project, ref), event);
       } catch (PermissionBackendException e) {
-        repLog.atSevere().withCause(e).log("error posting event");
+        repLog.error("error posting event", e);
       }
     }
   }
@@ -769,7 +769,7 @@
       try {
         eventDispatcher.get().postEvent(BranchNameKey.create(project, ref), event);
       } catch (PermissionBackendException e) {
-        repLog.atSevere().withCause(e).log("error posting event");
+        repLog.error("error posting event", e);
       }
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationsCollection.java b/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationsCollection.java
index d869e83..71c38d0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationsCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationsCollection.java
@@ -106,7 +106,7 @@
         try {
           uri = new URIish(url);
         } catch (URISyntaxException e) {
-          repLog.atWarning().log("adminURL '%s' is invalid: %s", url, e.getMessage());
+          repLog.warn("adminURL '{}' is invalid: {}", url, e.getMessage());
           continue;
         }
 
@@ -114,14 +114,13 @@
           String path =
               replaceName(uri.getPath(), projectName.get(), config.isSingleProjectMatch());
           if (path == null) {
-            repLog.atWarning().log("adminURL %s does not contain ${name}", uri);
+            repLog.warn("adminURL {} does not contain ${name}", uri);
             continue;
           }
 
           uri = uri.setPath(path);
           if (!isSSH(uri)) {
-            repLog.atWarning().log(
-                "adminURL '%s' is invalid: only SSH and HTTP are supported", uri);
+            repLog.warn("adminURL '{}' is invalid: only SSH and HTTP are supported", uri);
             continue;
           }
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/GerritRestApi.java b/src/main/java/com/googlesource/gerrit/plugins/replication/GerritRestApi.java
index 079087c..f910a40 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/GerritRestApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/GerritRestApi.java
@@ -62,34 +62,34 @@
 
   @Override
   public boolean createProject(Project.NameKey project, String head) {
-    repLog.atInfo().log("Creating project %s on %s", project, uri);
+    repLog.info("Creating project {} on {}", project, uri);
     String url = String.format("%s/a/projects/%s", toHttpUri(uri), Url.encode(project.get()));
     try {
       return httpClient
           .execute(new HttpPut(url), new HttpResponseHandler(), getContext())
           .isSuccessful();
     } catch (IOException e) {
-      repLog.atSevere().log("Couldn't perform project creation on %s", uri, e);
+      repLog.error("Couldn't perform project creation on {}", uri, e);
       return false;
     }
   }
 
   @Override
   public boolean deleteProject(Project.NameKey project) {
-    repLog.atInfo().log("Deleting project %s on %s", project, uri);
+    repLog.info("Deleting project {} on {}", project, uri);
     String url = String.format("%s/a/projects/%s", toHttpUri(uri), Url.encode(project.get()));
     try {
       httpClient.execute(new HttpDelete(url), new HttpResponseHandler(), getContext());
       return true;
     } catch (IOException e) {
-      repLog.atSevere().log("Couldn't perform project deletion on %s", uri, e);
+      repLog.error("Couldn't perform project deletion on {}", uri, e);
     }
     return false;
   }
 
   @Override
   public boolean updateHead(Project.NameKey project, String newHead) {
-    repLog.atInfo().log("Updating head of %s on %s", project, uri);
+    repLog.info("Updating head of {} on {}", project, uri);
     String url = String.format("%s/a/projects/%s/HEAD", toHttpUri(uri), Url.encode(project.get()));
     try {
       HttpPut req = new HttpPut(url);
@@ -99,7 +99,7 @@
       httpClient.execute(req, new HttpResponseHandler(), getContext());
       return true;
     } catch (IOException e) {
-      repLog.atSevere().log("Couldn't perform update head on %s", uri, e);
+      repLog.error("Couldn't perform update head on {}", uri, e);
     }
     return false;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/LocalFS.java b/src/main/java/com/googlesource/gerrit/plugins/replication/LocalFS.java
index b092363..da960e6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/LocalFS.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/LocalFS.java
@@ -43,9 +43,9 @@
         u.disableRefLog();
         u.link(head);
       }
-      repLog.atInfo().log("Created local repository: %s", uri);
+      repLog.info("Created local repository: {}", uri);
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log("Error creating local repository %s", uri.getPath());
+      repLog.error("Error creating local repository {}", uri.getPath(), e);
       return false;
     }
     return true;
@@ -55,9 +55,9 @@
   public boolean deleteProject(Project.NameKey project) {
     try {
       recursivelyDelete(new File(uri.getPath()));
-      repLog.atInfo().log("Deleted local repository: %s", uri);
+      repLog.info("Deleted local repository: {}", uri);
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log("Error deleting local repository %s:\n", uri.getPath());
+      repLog.error("Error deleting local repository {}:\n", uri.getPath(), e);
       return false;
     }
     return true;
@@ -71,8 +71,7 @@
         u.link(newHead);
       }
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log(
-          "Failed to update HEAD of repository %s to %s", uri.getPath(), newHead);
+      repLog.error("Failed to update HEAD of repository {} to {}", uri.getPath(), newHead, e);
       return false;
     }
     return true;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
index 4cff68e..883cb23 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
@@ -165,16 +165,17 @@
 
   @Override
   public void cancel() {
-    repLog.atInfo().log("Replication [%s] to %s was canceled", HexFormat.fromInt(id), getURI());
+    repLog.info("Replication [{}] to {} was canceled", HexFormat.fromInt(id), getURI());
     canceledByReplication();
     pool.pushWasCanceled(this);
   }
 
   @Override
   public void setCanceledWhileRunning() {
-    repLog.atInfo().log(
-        "Replication [%s] to %s was canceled while being executed",
-        HexFormat.fromInt(id), getURI());
+    repLog.info(
+        "Replication [{}] to {} was canceled while being executed",
+        HexFormat.fromInt(id),
+        getURI());
     canceledWhileRunning.set(true);
   }
 
@@ -229,10 +230,10 @@
     if (ALL_REFS.equals(ref)) {
       delta.clear();
       pushAllRefs = true;
-      repLog.atFinest().log("Added all refs for replication to %s", uri);
+      repLog.trace("Added all refs for replication to {}", uri);
     } else if (!pushAllRefs) {
       delta.add(ref);
-      repLog.atFinest().log("Added ref %s for replication to %s", ref, uri);
+      repLog.trace("Added ref {} for replication to {}", ref, uri);
     }
   }
 
@@ -317,18 +318,18 @@
     RunwayStatus status = pool.requestRunway(this);
     if (!status.isAllowed()) {
       if (status.isCanceled()) {
-        repLog.atInfo().log(
-            "PushOp for replication to %s was canceled and thus won't be rescheduled", uri);
+        repLog.info("PushOp for replication to {} was canceled and thus won't be rescheduled", uri);
       } else {
-        repLog.atInfo().log(
-            "Rescheduling replication to %s to avoid collision with the in-flight push [%s].",
-            uri, HexFormat.fromInt(status.getInFlightPushId()));
+        repLog.info(
+            "Rescheduling replication to {} to avoid collision with the in-flight push [{}].",
+            uri,
+            HexFormat.fromInt(status.getInFlightPushId()));
         pool.reschedule(this, Destination.RetryReason.COLLISION);
       }
       return;
     }
 
-    repLog.atInfo().log("Replication to %s started...", uri);
+    repLog.info("Replication to {} started...", uri);
     Timer1.Context<String> destinationContext = metrics.start(config.getName());
     try {
       long startedAt = destinationContext.getStartTime();
@@ -342,9 +343,12 @@
         metrics.recordSlowProjectReplication(
             config.getName(), projectName.get(), pool.getSlowLatencyThreshold(), elapsed);
       }
-      repLog.atInfo().log(
-          "Replication to %s completed in %dms, %dms delay, %d retries",
-          uri, elapsed, delay, retryCount);
+      repLog.info(
+          "Replication to {} completed in {}ms, {}ms delay, {} retries",
+          uri,
+          elapsed,
+          delay,
+          retryCount);
     } catch (RepositoryNotFoundException e) {
       stateLog.error(
           "Cannot replicate " + projectName + "; Local repository error: " + e.getMessage(),
@@ -361,7 +365,7 @@
           || msg.contains("unavailable")) {
         createRepository();
       } else {
-        repLog.atSevere().log("Cannot replicate %s; Remote repository error: %s", projectName, msg);
+        repLog.error("Cannot replicate {}; Remote repository error: {}", projectName, msg);
       }
 
     } catch (NoRemoteRepositoryException e) {
@@ -371,10 +375,10 @@
     } catch (TransportException e) {
       Throwable cause = e.getCause();
       if (cause instanceof JSchException && cause.getMessage().startsWith("UnknownHostKey:")) {
-        repLog.atSevere().log("Cannot replicate to %s: %s", uri, cause.getMessage());
+        repLog.error("Cannot replicate to {}: {}", uri, cause.getMessage());
       } else if (e instanceof LockFailureException) {
         lockRetryCount++;
-        repLog.atSevere().log("Cannot replicate to %s due to lock failure", uri);
+        repLog.error("Cannot replicate to {} due to lock failure", uri);
 
         // The remote push operation should be retried.
         if (lockRetryCount <= maxLockRetries) {
@@ -384,14 +388,14 @@
             pool.reschedule(this, Destination.RetryReason.TRANSPORT_ERROR);
           }
         } else {
-          repLog.atSevere().log(
-              "Giving up after %d lock failures during replication to %s", lockRetryCount, uri);
+          repLog.error(
+              "Giving up after {} lock failures during replication to {}", lockRetryCount, uri);
         }
       } else {
         if (canceledWhileRunning.get()) {
           logCanceledWhileRunningException(e);
         } else {
-          repLog.atSevere().withCause(e).log("Cannot replicate to %s", uri);
+          repLog.error("Cannot replicate to {}", uri, e);
           // The remote push operation should be retried.
           pool.reschedule(this, Destination.RetryReason.TRANSPORT_ERROR);
         }
@@ -409,7 +413,7 @@
   }
 
   private void logCanceledWhileRunningException(TransportException e) {
-    repLog.atInfo().withCause(e).log("Cannot replicate to %s. It was canceled while running", uri);
+    repLog.info("Cannot replicate to {}. It was canceled while running", uri, e);
   }
 
   private void createRepository() {
@@ -417,11 +421,10 @@
       try {
         Ref head = git.exactRef(Constants.HEAD);
         if (createProject(projectName, head != null ? getName(head) : null)) {
-          repLog.atWarning().log("Missing repository created; retry replication to %s", uri);
+          repLog.warn("Missing repository created; retry replication to {}", uri);
           pool.reschedule(this, Destination.RetryReason.REPOSITORY_MISSING);
         } else {
-          repLog.atWarning().log(
-              "Missing repository could not be created when replicating %s", uri);
+          repLog.warn("Missing repository could not be created when replicating {}", uri);
         }
       } catch (IOException ioe) {
         stateLog.error(
@@ -468,10 +471,10 @@
     }
 
     if (replConfig.getMaxRefsToLog() == 0 || todo.size() <= replConfig.getMaxRefsToLog()) {
-      repLog.atInfo().log("Push to %s references: %s", uri, todo);
+      repLog.info("Push to {} references: {}", uri, todo);
     } else {
-      repLog.atInfo().log(
-          "Push to %s references (first %d of %d listed): %s",
+      repLog.info(
+          "Push to {} references (first {} of {} listed): {}",
           uri,
           replConfig.getMaxRefsToLog(),
           todo.size(),
@@ -530,7 +533,7 @@
     Map<String, Ref> remote = listRemote(tn);
     for (Ref src : local.values()) {
       if (!canPushRef(src.getName(), noPerms)) {
-        repLog.atFine().log("Skipping push of ref %s", src.getName());
+        repLog.debug("Skipping push of ref {}", src.getName());
         continue;
       }
 
@@ -547,7 +550,7 @@
     if (config.isMirror()) {
       for (Ref ref : remote.values()) {
         if (Constants.HEAD.equals(ref.getName())) {
-          repLog.atFine().log("Skipping deletion of %s", ref.getName());
+          repLog.debug("Skipping deletion of {}", ref.getName());
           continue;
         }
         RefSpec spec = matchDst(ref.getName());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSsh.java b/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSsh.java
index b8da2e4..0db32e3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSsh.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSsh.java
@@ -42,14 +42,18 @@
     OutputStream errStream = sshHelper.newErrorBufferStream();
     try {
       sshHelper.executeRemoteSsh(uri, cmd, errStream);
-      repLog.atInfo().log("Created remote repository: %s", uri);
+      repLog.info("Created remote repository: {}", uri);
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log(
-          "Error creating remote repository at %s:\n"
-              + "  Exception: %s\n"
-              + "  Command: %s\n"
-              + "  Output: %s",
-          uri, e, cmd, errStream);
+      repLog.error(
+          "Error creating remote repository at {}:\n"
+              + "  Exception: {}\n"
+              + "  Command: {}\n"
+              + "  Output: {}",
+          uri,
+          e,
+          cmd,
+          errStream,
+          e);
       return false;
     }
     return true;
@@ -62,14 +66,18 @@
     OutputStream errStream = sshHelper.newErrorBufferStream();
     try {
       sshHelper.executeRemoteSsh(uri, cmd, errStream);
-      repLog.atInfo().log("Deleted remote repository: %s", uri);
+      repLog.info("Deleted remote repository: {}", uri);
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log(
-          "Error deleting remote repository at %s}:\n"
-              + "  Exception: %s\n"
-              + "  Command: %s\n"
-              + "  Output: %s",
-          uri, e, cmd, errStream);
+      repLog.error(
+          "Error deleting remote repository at {}}:\n"
+              + "  Exception: {}\n"
+              + "  Command: {}\n"
+              + "  Output: {}",
+          uri,
+          e,
+          cmd,
+          errStream,
+          e);
       return false;
     }
     return true;
@@ -84,12 +92,17 @@
     try {
       sshHelper.executeRemoteSsh(uri, cmd, errStream);
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log(
-          "Error updating HEAD of remote repository at %s to %s:\n"
-              + "  Exception: %s\n"
-              + "  Command: %s\n"
-              + "  Output: %s",
-          uri, newHead, e, cmd, errStream);
+      repLog.error(
+          "Error updating HEAD of remote repository at {} to {}:\n"
+              + "  Exception: {}\n"
+              + "  Command: {}\n"
+              + "  Output: {}",
+          uri,
+          newHead,
+          e,
+          cmd,
+          errStream,
+          e);
       return false;
     }
     return true;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
index bea30d4..e99f6b1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
@@ -47,9 +47,9 @@
     try {
       config.load();
     } catch (ConfigInvalidException e) {
-      repLog.atSevere().withCause(e).log("Config file %s is invalid: %s", cfgPath, e.getMessage());
+      repLog.error("Config file {} is invalid: {}", cfgPath, e.getMessage(), e);
     } catch (IOException e) {
-      repLog.atSevere().withCause(e).log("Cannot read %s: %s", cfgPath, e.getMessage());
+      repLog.error("Cannot read {}: {}", cfgPath, e.getMessage(), e);
     }
     this.replicateAllOnPluginStart = config.getBoolean("gerrit", "replicateOnStartup", false);
     this.defaultForceUpdate = config.getBoolean("gerrit", "defaultForceUpdate", false);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
index 3807e00..869f728 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
@@ -25,7 +25,6 @@
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.server.events.EventDispatcher;
 import com.google.gerrit.server.git.WorkQueue;
-import com.google.gerrit.util.logging.NamedFluentLogger;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.googlesource.gerrit.plugins.replication.PushResultProcessing.GitUpdateProcessing;
@@ -36,6 +35,8 @@
 import java.util.Queue;
 import java.util.Set;
 import org.eclipse.jgit.transport.URIish;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Manages automatic replication to remote repositories. */
 public class ReplicationQueue
@@ -45,7 +46,7 @@
         ProjectDeletedListener,
         HeadUpdatedListener {
   static final String REPLICATION_LOG_NAME = "replication_log";
-  static final NamedFluentLogger repLog = NamedFluentLogger.forName(REPLICATION_LOG_NAME);
+  static final Logger repLog = LoggerFactory.getLogger(REPLICATION_LOG_NAME);
 
   private final ReplicationStateListener stateLog;
 
@@ -88,7 +89,7 @@
     running = false;
     int discarded = destinations.get().shutdown();
     if (discarded > 0) {
-      repLog.atWarning().log("Canceled %d replication events during shutdown", discarded);
+      repLog.warn("Canceled {} replication events during shutdown", discarded);
     }
   }
 
@@ -145,7 +146,7 @@
           cfg.schedule(project, refName, uri, state, now);
         }
       } else {
-        repLog.atFine().log("Skipping ref %s on project %s", refName, project.get());
+        repLog.debug("Skipping ref {} on project {}", refName, project.get());
       }
     }
   }
@@ -158,7 +159,7 @@
       for (ReplicationTasksStorage.ReplicateRefUpdate t : replicationTasksStorage.listWaiting()) {
         String eventKey = String.format("%s:%s", t.project, t.ref);
         if (!eventsReplayed.contains(eventKey)) {
-          repLog.atInfo().log("Firing pending task %s", eventKey);
+          repLog.info("Firing pending task {}", eventKey);
           fire(t.project, t.ref);
           eventsReplayed.add(eventKey);
         }
@@ -187,7 +188,7 @@
     for (ReferenceUpdatedEvent event : beforeStartupEventsQueue) {
       String eventKey = String.format("%s:%s", event.projectName(), event.refName());
       if (!eventsReplayed.contains(eventKey)) {
-        repLog.atInfo().log("Firing pending task %s", event);
+        repLog.info("Firing pending task {}", event);
         fire(event.projectName(), event.refName());
         eventsReplayed.add(eventKey);
       }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java
index 3e73033..f2d55de 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java
@@ -31,19 +31,19 @@
   @Override
   public void warn(String msg, ReplicationState... states) {
     stateWriteErr("Warning: " + msg, states);
-    repLog.atWarning().log(msg);
+    repLog.warn(msg);
   }
 
   @Override
   public void error(String msg, ReplicationState... states) {
     stateWriteErr("Error: " + msg, states);
-    repLog.atSevere().log(msg);
+    repLog.error(msg);
   }
 
   @Override
   public void error(String msg, Throwable t, ReplicationState... states) {
     stateWriteErr("Error: " + msg, states);
-    repLog.atSevere().withCause(t).log(msg);
+    repLog.error(msg, t);
   }
 
   private void stateWriteErr(String msg, ReplicationState[] states) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/UpdateHeadTask.java b/src/main/java/com/googlesource/gerrit/plugins/replication/UpdateHeadTask.java
index fdbd5e7..ffa6be1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/UpdateHeadTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/UpdateHeadTask.java
@@ -58,8 +58,7 @@
       return;
     }
 
-    repLog.atWarning().log(
-        "Cannot update HEAD of project %s on remote site %s.", project, replicateURI);
+    repLog.warn("Cannot update HEAD of project {} on remote site {}.", project, replicateURI);
   }
 
   @Override