Migrate all remaining classes to Flogger

This is the next part of the migration to Flogger. This change migrates
all remaining classes Flogger. This means all classes in Gerrit core now
use Flogger.

During this migration we try to make the log statements more consistent:
- avoid string concatenation
- avoid usage of String.format(...)

The visibility of the slf4j library is restricted to plugins and jgit
now. This avoids that we accidentally add new dependencies to slf4j.

Change-Id: Ide573327315a15cde69b68b5f27934deeb790d37
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/WORKSPACE b/WORKSPACE
index ef9e9f6..924eab8 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -252,12 +252,6 @@
 )
 
 maven_jar(
-    name = "log_nop",
-    artifact = "org.slf4j:slf4j-nop:" + SLF4J_VERS,
-    sha1 = "6cca9a3b999ff28b7a35ca762b3197cd7e4c2ad1",
-)
-
-maven_jar(
     name = "log_ext",
     artifact = "org.slf4j:slf4j-ext:" + SLF4J_VERS,
     sha1 = "09a8f58c784c37525d2624062414358acf296717",
diff --git a/gerrit-gwtdebug/BUILD b/gerrit-gwtdebug/BUILD
index b4cd663..f564745 100644
--- a/gerrit-gwtdebug/BUILD
+++ b/gerrit-gwtdebug/BUILD
@@ -6,11 +6,11 @@
         "//java/com/google/gerrit/pgm",
         "//java/com/google/gerrit/pgm/util",
         "//java/com/google/gerrit/util/cli",
+        "//lib/flogger:api",
         "//lib/gwt:dev",
         "//lib/jetty:server",
         "//lib/jetty:servlet",
         "//lib/jetty:servlets",
-        "//lib/log:api",
         "//lib/log:log4j",
     ],
 )
diff --git a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
index 4edff0e..cf84919 100644
--- a/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
+++ b/gerrit-gwtdebug/src/main/java/com/google/gerrit/gwtdebug/GerritGwtDebugLauncher.java
@@ -14,16 +14,15 @@
 
 package com.google.gerrit.gwtdebug;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.pgm.Daemon;
 import com.google.gwt.dev.codeserver.CodeServer;
 import com.google.gwt.dev.codeserver.Options;
 import java.util.ArrayList;
 import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class GerritGwtDebugLauncher {
-  private static final Logger log = LoggerFactory.getLogger(GerritGwtDebugLauncher.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static void main(String[] argv) throws Exception {
     GerritGwtDebugLauncher launcher = new GerritGwtDebugLauncher();
@@ -54,7 +53,7 @@
 
     Options options = new Options();
     if (!options.parseArgs(sdmLauncherOptions.toArray(new String[sdmLauncherOptions.size()]))) {
-      log.error("Failed to parse codeserver arguments");
+      logger.atSevere().log("Failed to parse codeserver arguments");
       return 1;
     }
 
@@ -65,11 +64,11 @@
           new Daemon()
               .main(daemonLauncherOptions.toArray(new String[daemonLauncherOptions.size()]));
       if (r != 0) {
-        log.error("Daemon exited with return code: " + r);
+        logger.atSevere().log("Daemon exited with return code: %d", r);
         return 1;
       }
     } catch (Exception e) {
-      log.error("Cannot start daemon", e);
+      logger.atSevere().withCause(e).log("Cannot start daemon");
       return 1;
     }
 
diff --git a/java/com/google/gerrit/acceptance/BUILD b/java/com/google/gerrit/acceptance/BUILD
index 9587860..770805b 100644
--- a/java/com/google/gerrit/acceptance/BUILD
+++ b/java/com/google/gerrit/acceptance/BUILD
@@ -42,11 +42,11 @@
         "//lib/bouncycastle:bcpg",
         "//lib/bouncycastle:bcprov",
         "//lib/commons:compress",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/guice:guice-assistedinject",
         "//lib/guice:guice-servlet",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
         "//lib/mina:sshd",
         "//prolog:gerrit-prolog-common",
     ],
diff --git a/java/com/google/gerrit/asciidoctor/BUILD b/java/com/google/gerrit/asciidoctor/BUILD
index b2b0f5d..f5178a0 100644
--- a/java/com/google/gerrit/asciidoctor/BUILD
+++ b/java/com/google/gerrit/asciidoctor/BUILD
@@ -13,8 +13,6 @@
         "//lib:args4j",
         "//lib:guava",
         "//lib/asciidoctor",
-        "//lib/log:api",
-        "//lib/log:nop",
     ],
 )
 
diff --git a/java/com/google/gerrit/common/BUILD b/java/com/google/gerrit/common/BUILD
index 2565f0d..800a975 100644
--- a/java/com/google/gerrit/common/BUILD
+++ b/java/com/google/gerrit/common/BUILD
@@ -24,8 +24,8 @@
         "//lib:servlet-api-3_1",
         "//lib/auto:auto-value",
         "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
     ],
     gwt_xml = "Common.gwt.xml",
     visibility = ["//visibility:public"],
@@ -50,8 +50,8 @@
         "//lib:servlet-api-3_1",
         "//lib/auto:auto-value",
         "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
     ],
 )
 
diff --git a/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java b/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
index e8fa896..04bb80f 100644
--- a/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
+++ b/java/com/google/gerrit/common/SiteLibraryLoaderUtil.java
@@ -21,26 +21,25 @@
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Ordering;
+import com.google.common.flogger.FluentLogger;
 import java.io.IOException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @GwtIncompatible("Unemulated classes in java.nio and Guava")
 public final class SiteLibraryLoaderUtil {
-  private static final Logger log = LoggerFactory.getLogger(SiteLibraryLoaderUtil.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static void loadSiteLib(Path libdir) {
     try {
       List<Path> jars = listJars(libdir);
       IoUtil.loadJARs(jars);
-      log.debug("Loaded site libraries: {}", jarList(jars));
+      logger.atFine().log("Loaded site libraries: %s", jarList(jars));
     } catch (IOException e) {
-      log.error("Error scanning lib directory " + libdir, e);
+      logger.atSevere().withCause(e).log("Error scanning lib directory %s", libdir);
     }
   }
 
diff --git a/java/com/google/gerrit/common/Version.java b/java/com/google/gerrit/common/Version.java
index 1777c3c..b8d3b67 100644
--- a/java/com/google/gerrit/common/Version.java
+++ b/java/com/google/gerrit/common/Version.java
@@ -18,16 +18,15 @@
 
 import com.google.common.annotations.GwtIncompatible;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @GwtIncompatible("Unemulated com.google.gerrit.common.Version")
 public class Version {
-  private static final Logger log = LoggerFactory.getLogger(Version.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @VisibleForTesting static final String DEV = "(dev)";
 
@@ -57,7 +56,7 @@
         return vs;
       }
     } catch (IOException e) {
-      log.error(e.getMessage(), e);
+      logger.atSevere().withCause(e).log(e.getMessage());
       return "(unknown version)";
     }
   }
diff --git a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index 320ebfa..ee4869b 100644
--- a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.io.CharStreams;
 import com.google.gerrit.elasticsearch.builders.QueryBuilder;
 import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
@@ -69,11 +70,9 @@
 import org.apache.http.entity.ContentType;
 import org.apache.http.nio.entity.NStringEntity;
 import org.elasticsearch.client.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 abstract class AbstractElasticIndex<K, V> implements Index<K, V> {
-  private static final Logger log = LoggerFactory.getLogger(AbstractElasticIndex.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   protected static final String BULK = "_bulk";
   protected static final String IGNORE_UNMAPPED = "ignore_unmapped";
@@ -332,7 +331,7 @@
             }
           }
         } else {
-          log.error(statusLine.getReasonPhrase());
+          logger.atSevere().log(statusLine.getReasonPhrase());
         }
         final List<T> r = Collections.unmodifiableList(results);
         return new ResultSet<T>() {
diff --git a/java/com/google/gerrit/elasticsearch/BUILD b/java/com/google/gerrit/elasticsearch/BUILD
index b771cf5..31ede79 100644
--- a/java/com/google/gerrit/elasticsearch/BUILD
+++ b/java/com/google/gerrit/elasticsearch/BUILD
@@ -17,6 +17,7 @@
         "//lib/commons:codec",
         "//lib/commons:lang",
         "//lib/elasticsearch-rest-client",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/guice:guice-assistedinject",
         "//lib/httpcomponents:httpasyncclient",
@@ -25,6 +26,5 @@
         "//lib/httpcomponents:httpcore-nio",
         "//lib/jackson:jackson-core",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
     ],
 )
diff --git a/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java b/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
index 612402e..58272f7 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticIndexVersionManager.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.elasticsearch;
 
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.primitives.Ints;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.index.Index;
@@ -31,12 +32,10 @@
 import java.util.Collection;
 import java.util.TreeMap;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ElasticIndexVersionManager extends VersionManager {
-  private static final Logger log = LoggerFactory.getLogger(ElasticIndexVersionManager.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final String prefix;
   private final ElasticIndexVersionDiscovery versionDiscovery;
@@ -61,13 +60,13 @@
       for (String version : versionDiscovery.discover(prefix, def.getName())) {
         Integer v = Ints.tryParse(version);
         if (v == null || version.length() != 4) {
-          log.warn("Unrecognized version in index {}: {}", def.getName(), version);
+          logger.atWarning().log("Unrecognized version in index %s: %s", def.getName(), version);
           continue;
         }
         versions.put(v, new Version<V>(null, v, true, cfg.getReady(def.getName(), v)));
       }
     } catch (IOException e) {
-      log.error("Error scanning index: " + def.getName(), e);
+      logger.atSevere().withCause(e).log("Error scanning index: %s", def.getName());
     }
 
     for (Schema<V> schema : def.getSchemas().values()) {
diff --git a/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
index 91f938c..102305b 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.elasticsearch;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.lifecycle.LifecycleModule;
 import com.google.gson.JsonParser;
@@ -32,12 +33,10 @@
 import org.elasticsearch.client.Response;
 import org.elasticsearch.client.RestClient;
 import org.elasticsearch.client.RestClientBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 class ElasticRestClientProvider implements Provider<RestClient>, LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(ElasticRestClientProvider.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final HttpHost[] hosts;
   private final String username;
@@ -68,7 +67,7 @@
         if (client == null) {
           client = build();
           ElasticVersion version = getVersion();
-          log.info("Elasticsearch integration version {}", version);
+          logger.atInfo().log("Elasticsearch integration version %s", version);
         }
       }
     }
@@ -117,7 +116,7 @@
               .getAsJsonObject()
               .get("number")
               .getAsString();
-      log.info("Connected to Elasticsearch version {}", version);
+      logger.atInfo().log("Connected to Elasticsearch version %s", version);
       return ElasticVersion.forVersion(version);
     } catch (IOException e) {
       throw new FailedToGetVersion(e);
diff --git a/java/com/google/gerrit/gpg/BUILD b/java/com/google/gerrit/gpg/BUILD
index bd6edab..0aa6ca2 100644
--- a/java/com/google/gerrit/gpg/BUILD
+++ b/java/com/google/gerrit/gpg/BUILD
@@ -11,9 +11,9 @@
         "//lib:gwtorm",
         "//lib/bouncycastle:bcpg-neverlink",
         "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/guice:guice-assistedinject",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
     ],
 )
diff --git a/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java b/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
index ffedcfb..bc0cd89 100644
--- a/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
+++ b/java/com/google/gerrit/gpg/GerritPublicKeyChecker.java
@@ -20,6 +20,7 @@
 import com.google.common.base.CharMatcher;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.io.BaseEncoding;
 import com.google.gerrit.common.PageLinks;
 import com.google.gerrit.server.IdentifiedUser;
@@ -44,8 +45,6 @@
 import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.transport.PushCertificateIdent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Checker for GPG public keys including Gerrit-specific checks.
@@ -54,7 +53,7 @@
  * ID in the database, or an email address thereof.
  */
 public class GerritPublicKeyChecker extends PublicKeyChecker {
-  private static final Logger log = LoggerFactory.getLogger(GerritPublicKeyChecker.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Singleton
   public static class Factory {
@@ -137,7 +136,7 @@
       return checkIdsForArbitraryUser(key);
     } catch (PGPException | OrmException e) {
       String msg = "Error checking user IDs for key";
-      log.warn(msg + " " + keyIdToString(key.getKeyID()), e);
+      logger.atWarning().withCause(e).log("%s %s", msg, keyIdToString(key.getKeyID()));
       return CheckResult.bad(msg);
     }
   }
diff --git a/java/com/google/gerrit/gpg/GpgModule.java b/java/com/google/gerrit/gpg/GpgModule.java
index d12e921..45c1ab5 100644
--- a/java/com/google/gerrit/gpg/GpgModule.java
+++ b/java/com/google/gerrit/gpg/GpgModule.java
@@ -14,15 +14,14 @@
 
 package com.google.gerrit.gpg;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.gpg.api.GpgApiModule;
 import com.google.gerrit.server.EnableSignedPush;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class GpgModule extends FactoryModule {
-  private static final Logger log = LoggerFactory.getLogger(GpgModule.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final Config cfg;
 
@@ -39,7 +38,7 @@
     bindConstant().annotatedWith(EnableSignedPush.class).to(enableSignedPush);
 
     if (configEnableSignedPush && !havePgp) {
-      log.info("Bouncy Castle PGP not installed; signed push verification is disabled");
+      logger.atInfo().log("Bouncy Castle PGP not installed; signed push verification is disabled");
     }
     if (enableSignedPush) {
       install(new SignedPushModule());
diff --git a/java/com/google/gerrit/gpg/PublicKeyChecker.java b/java/com/google/gerrit/gpg/PublicKeyChecker.java
index 70e9a24..bd6e0d7 100644
--- a/java/com/google/gerrit/gpg/PublicKeyChecker.java
+++ b/java/com/google/gerrit/gpg/PublicKeyChecker.java
@@ -28,6 +28,7 @@
 import static org.bouncycastle.openpgp.PGPSignature.DIRECT_KEY;
 import static org.bouncycastle.openpgp.PGPSignature.KEY_REVOCATION;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -49,12 +50,10 @@
 import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
 import org.bouncycastle.openpgp.PGPSignature;
 import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Checker for GPG public keys for use in a push certificate. */
 public class PublicKeyChecker {
-  private static final Logger log = LoggerFactory.getLogger(PublicKeyChecker.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   // https://tools.ietf.org/html/rfc4880#section-5.2.3.13
   private static final int COMPLETE_TRUST = 120;
@@ -294,12 +293,11 @@
         // Revoker is authorized and there is a revocation signature by this
         // revoker, but the key is not in the store so we can't verify the
         // signature.
-        log.info(
-            "Key "
-                + Fingerprint.toString(key.getFingerprint())
-                + " is revoked by "
-                + Fingerprint.toString(rfp)
-                + ", which is not in the store. Assuming revocation is valid.");
+        logger
+            .atInfo()
+            .log(
+                "Key %s is revoked by %s, which is not in the store. Assuming revocation is valid.",
+                Fingerprint.toString(key.getFingerprint()), Fingerprint.toString(rfp));
         problems.add(reasonToString(getRevocationReason(revocation)));
         continue;
       }
diff --git a/java/com/google/gerrit/gpg/PushCertificateChecker.java b/java/com/google/gerrit/gpg/PushCertificateChecker.java
index 95b89d0..82b3892 100644
--- a/java/com/google/gerrit/gpg/PushCertificateChecker.java
+++ b/java/com/google/gerrit/gpg/PushCertificateChecker.java
@@ -21,6 +21,7 @@
 import static com.google.gerrit.gpg.PublicKeyStore.keyToString;
 
 import com.google.common.base.Joiner;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.common.GpgKeyInfo.Status;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -38,12 +39,10 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.transport.PushCertificate;
 import org.eclipse.jgit.transport.PushCertificate.NonceStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Checker for push certificates. */
 public abstract class PushCertificateChecker {
-  private static final Logger log = LoggerFactory.getLogger(PushCertificateChecker.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static class Result {
     private final PGPPublicKey key;
@@ -107,7 +106,7 @@
       }
     } catch (PGPException | IOException e) {
       String msg = "Internal error checking push certificate";
-      log.error(msg, e);
+      logger.atSevere().withCause(e).log(msg);
       results.add(CheckResult.bad(msg));
     }
 
diff --git a/java/com/google/gerrit/gpg/SignedPushModule.java b/java/com/google/gerrit/gpg/SignedPushModule.java
index c420f6f..58d2228 100644
--- a/java/com/google/gerrit/gpg/SignedPushModule.java
+++ b/java/com/google/gerrit/gpg/SignedPushModule.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.gpg;
 
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.reviewdb.client.BooleanProjectConfig;
 import com.google.gerrit.reviewdb.client.Project;
@@ -42,11 +43,9 @@
 import org.eclipse.jgit.transport.PreReceiveHookChain;
 import org.eclipse.jgit.transport.ReceivePack;
 import org.eclipse.jgit.transport.SignedPushConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class SignedPushModule extends AbstractModule {
-  private static final Logger log = LoggerFactory.getLogger(SignedPushModule.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Override
   protected void configure() {
@@ -93,11 +92,13 @@
         rp.setSignedPushConfig(null);
         return;
       } else if (signedPushConfig == null) {
-        log.error(
-            "receive.enableSignedPush is true for project {} but"
-                + " false in gerrit.config, so signed push verification is"
-                + " disabled",
-            project.get());
+        logger
+            .atSevere()
+            .log(
+                "receive.enableSignedPush is true for project %s but"
+                    + " false in gerrit.config, so signed push verification is"
+                    + " disabled",
+                project.get());
         rp.setSignedPushConfig(null);
         return;
       }
diff --git a/java/com/google/gerrit/gpg/server/GpgKeys.java b/java/com/google/gerrit/gpg/server/GpgKeys.java
index 4fd30a7..b1c9f29 100644
--- a/java/com/google/gerrit/gpg/server/GpgKeys.java
+++ b/java/com/google/gerrit/gpg/server/GpgKeys.java
@@ -19,6 +19,7 @@
 
 import com.google.common.base.CharMatcher;
 import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.io.BaseEncoding;
 import com.google.gerrit.extensions.common.GpgKeyInfo;
 import com.google.gerrit.extensions.registration.DynamicMap;
@@ -53,12 +54,10 @@
 import org.bouncycastle.openpgp.PGPPublicKey;
 import org.bouncycastle.openpgp.PGPPublicKeyRing;
 import org.eclipse.jgit.util.NB;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 public class GpgKeys implements ChildCollection<AccountResource, GpgKey> {
-  private static final Logger log = LoggerFactory.getLogger(GpgKeys.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static final String MIME_TYPE = "application/pgp-keys";
 
@@ -164,7 +163,9 @@
             }
           }
           if (!found) {
-            log.warn("No public key stored for fingerprint {}", Fingerprint.toString(fp));
+            logger
+                .atWarning()
+                .log("No public key stored for fingerprint %s", Fingerprint.toString(fp));
           }
         }
       }
diff --git a/java/com/google/gerrit/gpg/server/PostGpgKeys.java b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
index 4b92ec3..90104dd 100644
--- a/java/com/google/gerrit/gpg/server/PostGpgKeys.java
+++ b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.io.BaseEncoding;
 import com.google.gerrit.common.errors.EmailException;
 import com.google.gerrit.extensions.api.accounts.GpgKeysInput;
@@ -70,12 +71,11 @@
 import org.eclipse.jgit.lib.CommitBuilder;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.RefUpdate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 public class PostGpgKeys implements RestModifyView<AccountResource, GpgKeysInput> {
-  private final Logger log = LoggerFactory.getLogger(getClass());
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
   private final Provider<PersonIdent> serverIdent;
   private final Provider<CurrentUser> self;
   private final Provider<PublicKeyStore> storeProvider;
@@ -223,10 +223,12 @@
           try {
             addKeyFactory.create(rsrc.getUser(), addedKeys).send();
           } catch (EmailException e) {
-            log.error(
-                "Cannot send GPG key added message to "
-                    + rsrc.getUser().getAccount().getPreferredEmail(),
-                e);
+            logger
+                .atSevere()
+                .withCause(e)
+                .log(
+                    "Cannot send GPG key added message to %s",
+                    rsrc.getUser().getAccount().getPreferredEmail());
           }
           break;
         case NO_CHANGE:
diff --git a/java/com/google/gerrit/index/BUILD b/java/com/google/gerrit/index/BUILD
index f293b2d..5074350 100644
--- a/java/com/google/gerrit/index/BUILD
+++ b/java/com/google/gerrit/index/BUILD
@@ -43,7 +43,7 @@
         "//lib/antlr:java_runtime",
         "//lib/auto:auto-value",
         "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
     ],
 )
diff --git a/java/com/google/gerrit/index/Schema.java b/java/com/google/gerrit/index/Schema.java
index d20aed1..6850667 100644
--- a/java/com/google/gerrit/index/Schema.java
+++ b/java/com/google/gerrit/index/Schema.java
@@ -22,17 +22,18 @@
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
 import com.google.gwtorm.server.OrmException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Specific version of a secondary index schema. */
 public class Schema<T> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
   public static class Builder<T> {
     private final List<FieldDef<T, ?>> fields = new ArrayList<>();
 
@@ -58,8 +59,6 @@
     }
   }
 
-  private static final Logger log = LoggerFactory.getLogger(Schema.class);
-
   public static class Values<T> {
     private final FieldDef<T, ?> field;
     private final Iterable<?> values;
@@ -184,7 +183,10 @@
                 try {
                   v = f.get(obj);
                 } catch (OrmException e) {
-                  log.error("error getting field {} of {}", f.getName(), obj, e);
+                  logger
+                      .atSevere()
+                      .withCause(e)
+                      .log("error getting field %s of %s", f.getName(), obj);
                   return null;
                 }
                 if (v == null) {
diff --git a/java/com/google/gerrit/index/SiteIndexer.java b/java/com/google/gerrit/index/SiteIndexer.java
index 4ad0827..24b7a69 100644
--- a/java/com/google/gerrit/index/SiteIndexer.java
+++ b/java/com/google/gerrit/index/SiteIndexer.java
@@ -17,6 +17,7 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.common.base.Stopwatch;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.io.OutputStream;
@@ -27,11 +28,9 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.util.io.NullOutputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public abstract class SiteIndexer<K, V, I extends Index<K, V>> {
-  private static final Logger log = LoggerFactory.getLogger(SiteIndexer.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static class Result {
     private final long elapsedNanos;
@@ -128,7 +127,7 @@
     }
 
     private void fail(Throwable t) {
-      log.error("Failed to index " + desc, t);
+      logger.atSevere().withCause(t).log("Failed to index %s", desc);
       ok.set(false);
     }
 
diff --git a/java/com/google/gerrit/lifecycle/BUILD b/java/com/google/gerrit/lifecycle/BUILD
index 191305b..7ba6123 100644
--- a/java/com/google/gerrit/lifecycle/BUILD
+++ b/java/com/google/gerrit/lifecycle/BUILD
@@ -5,7 +5,7 @@
     deps = [
         "//java/com/google/gerrit/extensions:api",
         "//lib:guava",
+        "//lib/flogger:api",
         "//lib/guice",
-        "//lib/log:api",
     ],
 )
diff --git a/java/com/google/gerrit/lifecycle/LifecycleManager.java b/java/com/google/gerrit/lifecycle/LifecycleManager.java
index bbffd49..ba3d7b2 100644
--- a/java/com/google/gerrit/lifecycle/LifecycleManager.java
+++ b/java/com/google/gerrit/lifecycle/LifecycleManager.java
@@ -16,6 +16,7 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.registration.RegistrationHandle;
 import com.google.inject.Binding;
@@ -24,10 +25,11 @@
 import com.google.inject.TypeLiteral;
 import com.google.inject.util.Providers;
 import java.util.List;
-import org.slf4j.LoggerFactory;
 
 /** Tracks and executes registered {@link LifecycleListener}s. */
 public class LifecycleManager {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
   private final List<Provider<LifecycleListener>> listeners = newList();
   private final List<RegistrationHandle> handles = newList();
 
@@ -105,7 +107,7 @@
       try {
         obj.stop();
       } catch (Throwable err) {
-        LoggerFactory.getLogger(obj.getClass()).warn("Failed to stop", err);
+        logger.atWarning().withCause(err).log("Failed to stop %s", obj.getClass());
       }
       startedIndex = i - 1;
     }
diff --git a/java/com/google/gerrit/lucene/AbstractLuceneIndex.java b/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
index 3e6d79b..6e3086c 100644
--- a/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
+++ b/java/com/google/gerrit/lucene/AbstractLuceneIndex.java
@@ -22,6 +22,7 @@
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.util.concurrent.AbstractFuture;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -80,12 +81,10 @@
 import org.apache.lucene.search.TopFieldDocs;
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.store.Directory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Basic Lucene index implementation. */
 public abstract class AbstractLuceneIndex<K, V> implements Index<K, V> {
-  private static final Logger log = LoggerFactory.getLogger(AbstractLuceneIndex.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   static String sortFieldName(FieldDef<?, ?> f) {
     return f.getName() + "_SORT";
@@ -145,18 +144,19 @@
                     autoCommitWriter.commit();
                   }
                 } catch (IOException e) {
-                  log.error("Error committing " + index + " Lucene index", e);
+                  logger.atSevere().withCause(e).log("Error committing %s Lucene index", index);
                 } catch (OutOfMemoryError e) {
-                  log.error("Error committing " + index + " Lucene index", e);
+                  logger.atSevere().withCause(e).log("Error committing %s Lucene index", index);
                   try {
                     autoCommitWriter.close();
                   } catch (IOException e2) {
-                    log.error(
-                        "SEVERE: Error closing "
-                            + index
-                            + " Lucene index after OOM;"
-                            + " index may be corrupted.",
-                        e);
+                    logger
+                        .atSevere()
+                        .withCause(e)
+                        .log(
+                            "SEVERE: Error closing %s Lucene index after OOM;"
+                                + " index may be corrupted.",
+                            index);
                   }
                 }
               },
@@ -227,10 +227,13 @@
     writerThread.shutdown();
     try {
       if (!writerThread.awaitTermination(5, TimeUnit.SECONDS)) {
-        log.warn("shutting down " + name + " index with pending Lucene writes");
+        logger.atWarning().log("shutting down %s index with pending Lucene writes", name);
       }
     } catch (InterruptedException e) {
-      log.warn("interrupted waiting for pending Lucene writes of " + name + " index", e);
+      logger
+          .atWarning()
+          .withCause(e)
+          .log("interrupted waiting for pending Lucene writes of %s index", name);
     }
     reopenThread.close();
 
@@ -244,7 +247,7 @@
     try {
       searcherManager.maybeRefreshBlocking();
     } catch (IOException e) {
-      log.warn("error finishing pending Lucene writes", e);
+      logger.atWarning().withCause(e).log("error finishing pending Lucene writes");
     }
 
     try {
@@ -252,12 +255,12 @@
     } catch (AlreadyClosedException e) {
       // Ignore.
     } catch (IOException e) {
-      log.warn("error closing Lucene writer", e);
+      logger.atWarning().withCause(e).log("error closing Lucene writer");
     }
     try {
       dir.close();
     } catch (IOException e) {
-      log.warn("error closing Lucene directory", e);
+      logger.atWarning().withCause(e).log("error closing Lucene directory");
     }
   }
 
@@ -453,7 +456,7 @@
       try {
         return reopenThread.waitForGeneration(gen, 0);
       } catch (InterruptedException e) {
-        log.warn("Interrupted waiting for searcher generation", e);
+        logger.atWarning().withCause(e).log("Interrupted waiting for searcher generation");
         return false;
       }
     }
@@ -529,7 +532,7 @@
           try {
             release(searcher);
           } catch (IOException e) {
-            log.warn("cannot release Lucene searcher", e);
+            logger.atWarning().withCause(e).log("cannot release Lucene searcher");
           }
         }
       }
diff --git a/java/com/google/gerrit/lucene/BUILD b/java/com/google/gerrit/lucene/BUILD
index 0c53215..6cb7751 100644
--- a/java/com/google/gerrit/lucene/BUILD
+++ b/java/com/google/gerrit/lucene/BUILD
@@ -35,10 +35,10 @@
         "//java/com/google/gerrit/server",
         "//lib:guava",
         "//lib:gwtorm",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/guice:guice-assistedinject",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
         "//lib/lucene:lucene-analyzers-common",
         "//lib/lucene:lucene-core-and-backward-codecs",
         "//lib/lucene:lucene-misc",
diff --git a/java/com/google/gerrit/lucene/LuceneChangeIndex.java b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
index c8f8fff..7dfaac1 100644
--- a/java/com/google/gerrit/lucene/LuceneChangeIndex.java
+++ b/java/com/google/gerrit/lucene/LuceneChangeIndex.java
@@ -34,6 +34,7 @@
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.MultimapBuilder;
 import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.gerrit.index.QueryOptions;
@@ -91,8 +92,6 @@
 import org.apache.lucene.store.RAMDirectory;
 import org.apache.lucene.util.BytesRef;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Secondary index implementation using Apache Lucene.
@@ -102,7 +101,7 @@
  * a committed write and it showing up to other threads' searchers.
  */
 public class LuceneChangeIndex implements ChangeIndex {
-  private static final Logger log = LoggerFactory.getLogger(LuceneChangeIndex.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   static final String UPDATED_SORT_FIELD = sortFieldName(ChangeField.UPDATED);
   static final String ID_SORT_FIELD = sortFieldName(ChangeField.LEGACY_ID);
@@ -380,7 +379,7 @@
             try {
               indexes.get(i).release(searchers[i]);
             } catch (IOException e) {
-              log.warn("cannot release Lucene searcher", e);
+              logger.atWarning().withCause(e).log("cannot release Lucene searcher");
             }
           }
         }
diff --git a/java/com/google/gerrit/lucene/LuceneVersionManager.java b/java/com/google/gerrit/lucene/LuceneVersionManager.java
index aabce35..63abea8 100644
--- a/java/com/google/gerrit/lucene/LuceneVersionManager.java
+++ b/java/com/google/gerrit/lucene/LuceneVersionManager.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.lucene;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.common.primitives.Ints;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.index.Index;
@@ -33,12 +34,10 @@
 import java.util.Collection;
 import java.util.TreeMap;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 public class LuceneVersionManager extends VersionManager {
-  private static final Logger log = LoggerFactory.getLogger(LuceneVersionManager.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   static Path getDir(SitePaths sitePaths, String name, Schema<?> schema) {
     return sitePaths.index_dir.resolve(String.format("%s_%04d", name, schema.getVersion()));
@@ -62,7 +61,7 @@
       Path p = getDir(sitePaths, def.getName(), schema);
       boolean isDir = Files.isDirectory(p);
       if (Files.exists(p) && !isDir) {
-        log.warn("Not a directory: {}", p.toAbsolutePath());
+        logger.atWarning().log("Not a directory: %s", p.toAbsolutePath());
       }
       int v = schema.getVersion();
       versions.put(v, new Version<>(schema, v, isDir, cfg.getReady(def.getName(), v)));
@@ -78,7 +77,7 @@
         String versionStr = n.substring(prefix.length());
         Integer v = Ints.tryParse(versionStr);
         if (v == null || versionStr.length() != 4) {
-          log.warn("Unrecognized version in index directory: {}", p.toAbsolutePath());
+          logger.atWarning().log("Unrecognized version in index directory: %s", p.toAbsolutePath());
           continue;
         }
         if (!versions.containsKey(v)) {
@@ -86,7 +85,7 @@
         }
       }
     } catch (IOException e) {
-      log.error("Error scanning index directory: " + sitePaths.index_dir, e);
+      logger.atSevere().withCause(e).log("Error scanning index directory: %s", sitePaths.index_dir);
     }
     return versions;
   }
diff --git a/java/com/google/gerrit/metrics/BUILD b/java/com/google/gerrit/metrics/BUILD
index b32b087..dda2c39 100644
--- a/java/com/google/gerrit/metrics/BUILD
+++ b/java/com/google/gerrit/metrics/BUILD
@@ -8,8 +8,8 @@
         "//java/com/google/gerrit/lifecycle",
         "//java/org/eclipse/jgit:server",
         "//lib:guava",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
     ],
 )
diff --git a/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java b/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
index bc2846a..10d589a 100644
--- a/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
+++ b/java/com/google/gerrit/metrics/proc/OperatingSystemMXBeanProvider.java
@@ -14,15 +14,14 @@
 
 package com.google.gerrit.metrics.proc;
 
+import com.google.common.flogger.FluentLogger;
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
 import java.lang.reflect.Method;
 import java.util.Arrays;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class OperatingSystemMXBeanProvider {
-  private static final Logger log = LoggerFactory.getLogger(OperatingSystemMXBeanProvider.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final OperatingSystemMXBean sys;
   private final Method getProcessCpuTime;
@@ -41,10 +40,10 @@
             return new OperatingSystemMXBeanProvider(sys);
           }
         } catch (ReflectiveOperationException e) {
-          log.debug("No implementation for {}", name, e);
+          logger.atFine().withCause(e).log("No implementation for %s", name);
         }
       }
-      log.warn("No implementation of UnixOperatingSystemMXBean found");
+      logger.atWarning().log("No implementation of UnixOperatingSystemMXBean found");
       return null;
     }
   }
diff --git a/java/com/google/gerrit/testing/BUILD b/java/com/google/gerrit/testing/BUILD
index 875d636..43aa978 100644
--- a/java/com/google/gerrit/testing/BUILD
+++ b/java/com/google/gerrit/testing/BUILD
@@ -35,11 +35,11 @@
         "//lib:junit",
         "//lib/auto:auto-value",
         "//lib/auto:auto-value-annotations",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/guice:guice-servlet",
         "//lib/jgit/org.eclipse.jgit:jgit",
         "//lib/jgit/org.eclipse.jgit.junit:junit",
-        "//lib/log:api",
         "//lib/truth",
     ],
 )
diff --git a/java/com/google/gerrit/testing/FakeEmailSender.java b/java/com/google/gerrit/testing/FakeEmailSender.java
index 19e85db..28946dc 100644
--- a/java/com/google/gerrit/testing/FakeEmailSender.java
+++ b/java/com/google/gerrit/testing/FakeEmailSender.java
@@ -19,6 +19,7 @@
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.errors.EmailException;
 import com.google.gerrit.server.git.WorkQueue;
@@ -35,8 +36,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Email sender implementation that records messages in memory.
@@ -48,7 +47,7 @@
  */
 @Singleton
 public class FakeEmailSender implements EmailSender {
-  private static final Logger log = LoggerFactory.getLogger(FakeEmailSender.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static class Module extends AbstractModule {
     @Override
@@ -166,7 +165,7 @@
         try {
           task.get();
         } catch (ExecutionException | InterruptedException e) {
-          log.warn("error finishing email task", e);
+          logger.atWarning().withCause(e).log("error finishing email task");
         }
       }
     }
diff --git a/java/com/google/gerrit/testing/NoteDbChecker.java b/java/com/google/gerrit/testing/NoteDbChecker.java
index b5dd9e9..1dc8ee2 100644
--- a/java/com/google/gerrit/testing/NoteDbChecker.java
+++ b/java/com/google/gerrit/testing/NoteDbChecker.java
@@ -21,6 +21,7 @@
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
@@ -46,12 +47,10 @@
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Repository;
 import org.junit.runner.Description;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 public class NoteDbChecker {
-  static final Logger log = LoggerFactory.getLogger(NoteDbChecker.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final Provider<ReviewDb> dbProvider;
   private final GitRepositoryManager repoManager;
@@ -193,7 +192,7 @@
         } catch (Throwable t) {
           String msg = "Error converting change: " + c;
           msgs.add(msg);
-          log.error(msg, t);
+          logger.atSevere().withCause(t).log(msg);
           continue;
         }
         List<String> diff = expected.differencesFrom(actual);
diff --git a/java/gerrit/BUILD b/java/gerrit/BUILD
index 980ad23..4644af87 100644
--- a/java/gerrit/BUILD
+++ b/java/gerrit/BUILD
@@ -8,8 +8,8 @@
         "//java/com/google/gerrit/reviewdb:server",
         "//java/com/google/gerrit/server",
         "//lib:gwtorm",
+        "//lib/flogger:api",
         "//lib/jgit/org.eclipse.jgit:jgit",
-        "//lib/log:api",
         "//lib/prolog:runtime",
     ],
 )
diff --git a/java/gerrit/PRED_uploader_1.java b/java/gerrit/PRED_uploader_1.java
index bf1bf27..a0e4aaf 100644
--- a/java/gerrit/PRED_uploader_1.java
+++ b/java/gerrit/PRED_uploader_1.java
@@ -14,6 +14,7 @@
 
 package gerrit;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.server.rules.StoredValues;
@@ -25,11 +26,9 @@
 import com.googlecode.prolog_cafe.lang.StructureTerm;
 import com.googlecode.prolog_cafe.lang.SymbolTerm;
 import com.googlecode.prolog_cafe.lang.Term;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class PRED_uploader_1 extends Predicate.P1 {
-  private static final Logger log = LoggerFactory.getLogger(PRED_uploader_1.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private static final SymbolTerm user = SymbolTerm.intern("user", 1);
 
@@ -45,9 +44,11 @@
 
     PatchSet patchSet = StoredValues.getPatchSet(engine);
     if (patchSet == null) {
-      log.error(
-          "Failed to load current patch set of change "
-              + StoredValues.getChange(engine).getChangeId());
+      logger
+          .atSevere()
+          .log(
+              "Failed to load current patch set of change %s",
+              StoredValues.getChange(engine).getChangeId());
       return engine.fail();
     }
 
diff --git a/java/org/apache/commons/net/BUILD b/java/org/apache/commons/net/BUILD
index 0074a03..4951933 100644
--- a/java/org/apache/commons/net/BUILD
+++ b/java/org/apache/commons/net/BUILD
@@ -6,6 +6,5 @@
         "//java/com/google/gerrit/util/ssl",
         "//lib/commons:codec",
         "//lib/commons:net",
-        "//lib/log:api",
     ],
 )
diff --git a/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java b/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
index 9a5a899..5694bd0 100644
--- a/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
+++ b/javatests/com/google/gerrit/acceptance/ssh/SshCommandsIT.java
@@ -20,6 +20,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.acceptance.AbstractDaemonTest;
 import com.google.gerrit.acceptance.NoHttpd;
 import com.google.gerrit.acceptance.Sandboxed;
@@ -31,13 +32,11 @@
 import java.util.List;
 import java.util.Map;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @NoHttpd
 @UseSsh
 public class SshCommandsIT extends AbstractDaemonTest {
-  private static final Logger log = LoggerFactory.getLogger(SshCommandsIT.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   // TODO: It would be better to dynamically generate these lists
   private static final List<String> COMMON_ROOT_COMMANDS =
@@ -129,7 +128,7 @@
         // content of the stderr, which will always start with "gerrit command" when the --help
         // option is used.
         String cmd = String.format("gerrit%s%s %s", root.isEmpty() ? "" : " ", root, command);
-        log.debug(cmd);
+        logger.atFine().log(cmd);
         adminSshSession.exec(String.format("%s --help", cmd));
         String response = adminSshSession.getError();
         assertWithMessage(String.format("command %s failed: %s", command, response))
diff --git a/javatests/com/google/gerrit/gpg/BUILD b/javatests/com/google/gerrit/gpg/BUILD
index ab66f9a..baf65b7 100644
--- a/javatests/com/google/gerrit/gpg/BUILD
+++ b/javatests/com/google/gerrit/gpg/BUILD
@@ -24,11 +24,11 @@
         "//lib/bouncycastle:bcpg-neverlink",
         "//lib/bouncycastle:bcprov",
         "//lib/bouncycastle:bcprov-neverlink",
+        "//lib/flogger:api",
         "//lib/guice",
         "//lib/guice:guice-assistedinject",
         "//lib/jgit/org.eclipse.jgit:jgit",
         "//lib/jgit/org.eclipse.jgit.junit:junit",
-        "//lib/log:api",
         "//lib/truth",
     ],
 )
diff --git a/lib/log/BUILD b/lib/log/BUILD
index 8ca87e7..949260d 100644
--- a/lib/log/BUILD
+++ b/lib/log/BUILD
@@ -1,19 +1,14 @@
 java_library(
     name = "api",
     data = ["//lib:LICENSE-slf4j"],
-    visibility = ["//visibility:public"],
+    visibility = [
+        "//lib/jgit/org.eclipse.jgit:__pkg__",
+        "//plugins:__pkg__",
+    ],
     exports = ["@log_api//jar"],
 )
 
 java_library(
-    name = "nop",
-    data = ["//lib:LICENSE-slf4j"],
-    visibility = ["//visibility:public"],
-    exports = ["@log_nop//jar"],
-    runtime_deps = [":api"],
-)
-
-java_library(
     name = "ext",
     data = ["//lib:LICENSE-slf4j"],
     visibility = ["//visibility:public"],