diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java
index 361cecc..d0c642f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Action.java
@@ -18,6 +18,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Streams;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.Response;
@@ -51,13 +52,10 @@
 import java.util.Objects;
 import java.util.Set;
 import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Create and return OWNERS info when "Find Owners" button is clicked. */
 class Action implements RestReadView<RevisionResource>, UiAction<RevisionResource> {
-
-  private static final Logger log = LoggerFactory.getLogger(Action.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private AccountCache accountCache;
   private Emails emails;
@@ -156,7 +154,7 @@
           .filter(Objects::nonNull)
           .collect(toList());
     } catch (OrmException e) {
-      log.error("Exception for " + Config.getChangeId(changeData), e);
+      logger.atSevere().withCause(e).log("Exception for %s", Config.getChangeId(changeData));
       return new ArrayList<>();
     }
   }
@@ -220,7 +218,7 @@
       changeData = changeDataFactory.create(reviewDb, change);
       if (changeData.change().getDest().get() == null) {
         if (!Checker.isExemptFromOwnerApproval(changeData)) {
-          log.error("Cannot get branch of change: " + changeData.getId().get());
+          logger.atSevere().log("Cannot get branch of change: %d", changeData.getId().get());
         }
         return null; // no "Find Owners" button
       }
@@ -243,7 +241,7 @@
                       emails,
                       repo,
                       changeData);
-          log.trace("getDescription db key = " + db.key);
+          logger.atFiner().log("getDescription db key = %s", db.key);
           needFindOwners = db.getNumOwners() > 0;
         }
       }
@@ -252,7 +250,7 @@
           .setTitle("Find owners to add to Reviewers list")
           .setVisible(needFindOwners);
     } catch (IOException | OrmException e) {
-      log.error("Exception for " + Config.getChangeId(changeData), e);
+      logger.atSevere().withCause(e).log("Exception for %s", Config.getChangeId(changeData));
       throw new IllegalStateException(e);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java
index 3f48166..f1a2bee 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Cache.java
@@ -17,6 +17,7 @@
 import static java.util.concurrent.TimeUnit.SECONDS;
 
 import com.google.common.cache.CacheBuilder;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.Emails;
 import com.google.gerrit.server.project.ProjectState;
@@ -27,12 +28,10 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Save OwnersDb in a cache for multiple calls to submit_filter. */
 class Cache {
-  private static final Logger log = LoggerFactory.getLogger(Cache.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   // The OwnersDb is created from OWNERS files in directories that
   // contain changed files of a patch set, which belongs to a project
@@ -74,14 +73,14 @@
       dbCache.invalidateAll(); // release all cached objects
     }
     if (maxSeconds > 0) {
-      log.info("Initialize Cache with maxSeconds=" + maxSeconds + " maxSize=" + maxSize);
+      logger.atInfo().log("Initialize Cache with maxSeconds=%d maxSize=%d", maxSeconds, maxSize);
       dbCache =
           CacheBuilder.newBuilder()
               .maximumSize(maxSize)
               .expireAfterWrite(maxSeconds, SECONDS)
               .build();
     } else {
-      log.info("Cache disabled.");
+      logger.atInfo().log("Cache disabled.");
       dbCache = null;
     }
     return this;
@@ -138,24 +137,26 @@
       String branch,
       Collection<String> files) {
     if (dbCache == null) { // Do not cache OwnersDb
-      log.trace("Create new OwnersDb, key=" + key);
+      logger.atFiner().log("Create new OwnersDb, key=%s", key);
       return new OwnersDb(
           projectState, accountCache, emails, key, repository, changeData, branch, files);
     }
     try {
-      log.trace("Get from cash " + dbCache + ", key=" + key + ", cache size=" + dbCache.size());
+      logger.atFiner().log(
+          "Get from cache %s, key=%s, cache size=%d", dbCache, key, dbCache.size());
       return dbCache.get(
           key,
           new Callable<OwnersDb>() {
             @Override
             public OwnersDb call() {
-              log.trace("Create new OwnersDb, key=" + key);
+              logger.atFiner().log("Create new OwnersDb, key=%s", key);
               return new OwnersDb(
                   projectState, accountCache, emails, key, repository, changeData, branch, files);
             }
           });
     } catch (ExecutionException e) {
-      log.error("Cache.get has exception for " + Config.getChangeId(changeData), e);
+      logger.atSevere().withCause(e).log(
+          "Cache.get has exception for %s", Config.getChangeId(changeData));
       return new OwnersDb(
           projectState, accountCache, emails, key, repository, changeData, branch, files);
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java
index 30d1a4c..2d71283 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Checker.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.findowners;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.reviewdb.client.Change.Status;
 import com.google.gerrit.reviewdb.client.PatchSetApproval;
 import com.google.gerrit.server.account.AccountCache;
@@ -29,12 +30,10 @@
 import java.util.Optional;
 import java.util.Set;
 import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Check if a change needs owner approval. */
 public class Checker {
-  private static final Logger log = LoggerFactory.getLogger(Checker.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   // Accept both "Exempt-" and "Exempted-".
   private static final String EXEMPT_MESSAGE1 = "Exempt-From-Owner-Approval:";
@@ -122,7 +121,7 @@
       return new Checker(repository, changeData, minVoteLevel)
           .findApproval(projectState, accountCache, emails);
     } catch (OrmException | IOException e) {
-      log.error("Exception for " + Config.getChangeId(changeData), e);
+      logger.atSevere().withCause(e).log("Exception for %s ", Config.getChangeId(changeData));
       return 0; // owner approval may or may not be required.
     }
   }
@@ -135,7 +134,8 @@
         return true;
       }
     } catch (IOException | OrmException e) {
-      log.error("Cannot get commit message for " + Config.getChangeId(changeData), e);
+      logger.atSevere().withCause(e).log(
+          "Cannot get commit message for %s", Config.getChangeId(changeData));
       return true; // exempt from owner approval due to lack of data
     }
     // Abandoned and merged changes do not need approval again.
@@ -158,7 +158,7 @@
     if (minVoteLevel <= 0) {
       minVoteLevel = Config.getMinOwnerVoteLevel(projectState, changeData);
     }
-    log.trace("findApproval db key = " + db.key);
+    logger.atFiner().log("findApproval db key = %s", db.key);
     return findApproval(accountCache, db);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/Config.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/Config.java
index c09b3df..537df74 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/Config.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/Config.java
@@ -15,12 +15,11 @@
 package com.googlesource.gerrit.plugins.findowners;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.query.change.ChangeData;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** find-owners configuration parameters */
 class Config {
@@ -48,7 +47,7 @@
   private static boolean reportSyntaxError = false;
   private static boolean alwaysShowButton = false;
 
-  private static final Logger log = LoggerFactory.getLogger(Config.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   static void setVariables(String pluginName, PluginConfigFactory conf) {
     if (conf == null) { // When called from integration tests.
@@ -95,21 +94,18 @@
 
   static String getOwnersFileName(ProjectState projectState, ChangeData c) {
     if (projectState == null) {
-      log.error("Null projectState for change " + getChangeId(c));
+      logger.atSevere().log("Null projectState for change %s", getChangeId(c));
     } else if (config != null) {
       String name =
           config
               .getFromProjectConfigWithInheritance(projectState, PLUGIN_NAME)
               .getString(OWNERS_FILE_NAME, OWNERS);
       if (name.trim().equals("")) {
-        log.error(
-            "Project "
+        logger.atSevere().log(
+            "Project %s has wrong %s: \"%s\" for %s"
                 + projectState.getProject()
-                + " has wrong "
                 + OWNERS_FILE_NAME
-                + ": \""
                 + name
-                + "\" for "
                 + getChangeId(c));
         return OWNERS;
       }
@@ -125,7 +121,7 @@
 
   static int getMinOwnerVoteLevel(ProjectState projectState, ChangeData c) {
     if (projectState == null) {
-      log.error("Null projectState for change " + getChangeId(c));
+      logger.atSevere().log("Null projectState for change %s", getChangeId(c));
       return minOwnerVoteLevel;
     } else if (config == null) {
       return minOwnerVoteLevel;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java
index 322a3b5..c62a909 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/GetOwners.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.findowners;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.Response;
@@ -33,12 +34,10 @@
 import com.google.inject.Provider;
 import java.io.IOException;
 import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** REST API to get owners of a change. */
 public class GetOwners implements RestReadView<ChangeResource> {
-  private static final Logger log = LoggerFactory.getLogger(GetOwners.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final Action action;
 
@@ -84,7 +83,7 @@
     } catch (BadRequestException e) {
       // Catch this exception to avoid too many call stack dumps
       // from bad wrong client requests.
-      log.error("Exception: " + e);
+      logger.atSevere().log("Exception: " + e);
       return Response.none();
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
index bd84c13..227369a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
@@ -17,6 +17,7 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.google.common.collect.Multimap;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.server.account.AccountCache;
 import com.google.gerrit.server.account.Emails;
@@ -39,12 +40,10 @@
 import org.eclipse.jgit.revwalk.RevTree;
 import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.treewalk.TreeWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Keep all information about owners and owned files. */
 class OwnersDb {
-  private static final Logger log = LoggerFactory.getLogger(OwnersDb.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private AccountCache accountCache;
   private Emails emails;
@@ -101,7 +100,8 @@
       try {
         revision = repository.exactRef(branch).getObjectId().getName();
       } catch (Exception e) {
-        log.error("Fail to get branch revision for " + Config.getChangeId(changeData), e);
+        logger.atSevere().withCause(e).log(
+            "Fail to get branch revision for %s", Config.getChangeId(changeData));
       }
     }
     countNumOwners(files);
@@ -140,7 +140,7 @@
       try {
         email2ids = emails.getAccountsFor(ownerEmailsAsArray);
       } catch (Exception e) {
-        log.error("accounts.byEmails failed with exception: ", e);
+        logger.atSevere().withCause(e).log("accounts.byEmails failed");
       }
       for (String owner : ownerEmailsAsArray) {
         String email = owner;
@@ -161,7 +161,7 @@
             }
           }
         } catch (Exception e) {
-          log.error("Fail to find preferred email of " + owner, e);
+          logger.atSevere().withCause(e).log("Fail to find preferred email of %s", owner);
           errors.add(owner);
         }
         preferredEmails.put(owner, email);
@@ -182,8 +182,8 @@
       }
     }
     if (Config.getReportSyntaxError()) {
-      result.warnings.forEach(w -> log.warn(w));
-      result.errors.forEach(w -> log.error(w));
+      result.warnings.forEach(w -> logger.atWarning().log(w));
+      result.errors.forEach(w -> logger.atSevere().log(w));
     }
   }
 
@@ -298,11 +298,13 @@
     try {
       ObjectId id = repo.resolve(branch);
       if (id == null && changeData != null && !Checker.isExemptFromOwnerApproval(changeData)) {
-        log.error("cannot find branch " + branch + " for " + Config.getChangeId(changeData));
+        logger.atSevere().log(
+            "cannot find branch %s for %s", branch, Config.getChangeId(changeData));
       }
       return id;
     } catch (Exception e) {
-      log.error("cannot find branch " + branch + " for " + Config.getChangeId(changeData), e);
+      logger.atSevere().withCause(e).log(
+          "cannot find branch %s for %s", branch, Config.getChangeId(changeData));
     }
     return null;
   }
@@ -317,7 +319,7 @@
         return new String(reader.open(treeWalk.getObjectId(0)).getBytes(), UTF_8);
       }
     } catch (Exception e) {
-      log.error("get file " + file, e);
+      logger.atSevere().withCause(e).log("get file %s", file);
     }
     return "";
   }
