findowners: migrate to Flogger

Gerrit core has been migrated to Flogger. Let's migrate this plugin,
too.

Change-Id: Iaff2922298d7da70b55fd93765592baf7eba2af9
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 "";
   }