Switch to Flogger

Upstream gerrit switched to Flogger. So we should as well.

Change-Id: Ib18bffd16eeca468a95546b4deb8bb43a65325ae
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
index 08f73c5..9dda01f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/ItsConfig.java
@@ -16,6 +16,7 @@
 
 import static java.util.stream.Collectors.toList;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.data.AccessSection;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.entities.Project.NameKey;
@@ -44,13 +45,11 @@
 import java.util.Optional;
 import java.util.regex.Pattern;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class ItsConfig {
   private static final String PLUGIN = "plugin";
 
-  private static final Logger log = LoggerFactory.getLogger(ItsConfig.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final String pluginName;
   private final ProjectCache projectCache;
@@ -89,17 +88,16 @@
         || event instanceof RefUpdatedEvent) {
       return isEnabled(event.getProjectNameKey(), event.getRefName());
     }
-    log.debug("Event {} not recognised and ignored", event);
+    logger.atFine().log("Event %s not recognised and ignored", event);
     return false;
   }
 
   public boolean isEnabled(Project.NameKey projectNK, String refName) {
     ProjectState projectState = projectCache.get(projectNK);
     if (projectState == null) {
-      log.error(
-          "Failed to check if {} is enabled for project {}: Project not found",
-          pluginName,
-          projectNK.get());
+      logger.atSevere().log(
+          "Failed to check if %s is enabled for project %s: Project not found",
+          pluginName, projectNK.get());
       return false;
     }
     return isEnforcedByAnyParentProject(refName, projectState)
@@ -257,7 +255,8 @@
       try {
         return pluginCfgFactory.getFromProjectConfigWithInheritance(projectName, pluginName);
       } catch (NoSuchProjectException e) {
-        log.error("Cannot access " + projectName + " configuration for plugin " + pluginName, e);
+        logger.atSevere().withCause(e).log(
+            "Cannot access %s configuration for plugin %s", projectName, pluginName);
       }
     }
     return new PluginConfig(pluginName, new Config());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java
index ecf3a6f..ba7fb14 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/its/NoopItsFacade.java
@@ -14,73 +14,55 @@
 
 package com.googlesource.gerrit.plugins.its.base.its;
 
+import com.google.common.flogger.FluentLogger;
 import java.io.IOException;
 import java.net.URL;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** An ITS facade doing nothing, it's configured when no ITS are referenced in config */
 public class NoopItsFacade implements ItsFacade {
-
-  private Logger log = LoggerFactory.getLogger(NoopItsFacade.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Override
   public void addComment(String issueId, String comment) throws IOException {
-    if (log.isDebugEnabled()) {
-      log.debug("addComment({},{})", issueId, comment);
-    }
+    logger.atFine().log("addComment(%s,%s)", issueId, comment);
   }
 
   @Override
   public void addValueToField(String issueId, String value, String fieldId) throws IOException {
-    if (log.isDebugEnabled()) {
-      log.debug("addValueToField({},{},{})", issueId, fieldId, value);
-    }
+    logger.atFine().log("addValueToField(%s,%s,%s)", issueId, fieldId, value);
   }
 
   @Override
   public void addRelatedLink(String issueId, URL relatedUrl, String description)
       throws IOException {
-    if (log.isDebugEnabled()) {
-      log.debug("addRelatedLink({},{},{})", issueId, relatedUrl, description);
-    }
+    logger.atFine().log("addRelatedLink(%s,%s,%s)", issueId, relatedUrl, description);
   }
 
   @Override
   public boolean exists(String issueId) throws IOException {
-    if (log.isDebugEnabled()) {
-      log.debug("exists({})", issueId);
-    }
+    logger.atFine().log("exists(%s)", issueId);
     return false;
   }
 
   @Override
   public void performAction(String issueId, String actionName) throws IOException {
-    if (log.isDebugEnabled()) {
-      log.debug("performAction({},{})", issueId, actionName);
-    }
+    logger.atFine().log("performAction(%s,%s)", issueId, actionName);
   }
 
   @Override
   public void createVersion(String itsProject, String version) {
-    if (log.isDebugEnabled()) {
-      log.debug("createVersion({},{})", itsProject, version);
-    }
+    logger.atFine().log("createVersion(%s,%s)", itsProject, version);
   }
 
   @Override
   public String healthCheck(Check check) throws IOException {
-    if (log.isDebugEnabled()) {
-      log.debug("healthCheck()");
-    }
+    logger.atFine().log("healthCheck()");
     return "{\"status\"=\"ok\",\"system\"=\"not configured\",}";
   }
 
   @Override
   public String createLinkForWebui(String url, String text) {
-    if (log.isDebugEnabled()) {
-      log.debug("createLinkForWebui({},{})", url, text);
-    }
+    logger.atFine().log("createLinkForWebui(%s,%s)", url, text);
     return "";
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java
index b34bd55..0fd523d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/CommitMessageFetcher.java
@@ -1,5 +1,6 @@
 package com.googlesource.gerrit.plugins.its.base.util;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
@@ -8,11 +9,9 @@
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevWalk;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class CommitMessageFetcher {
-  private static final Logger log = LoggerFactory.getLogger(CommitMessageFetcher.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final GitRepositoryManager repoManager;
 
@@ -35,9 +34,8 @@
     try {
       ret = fetch(projectName, commitId);
     } catch (IOException e) {
-      log.error(
-          "Could not fetch commit message for commit " + commitId + " of project " + projectName,
-          e);
+      logger.atSevere().withCause(e).log(
+          "Could not fetch commit message for commit %s of project %s", commitId, projectName);
     }
     return ret;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java
index 44611fe..6131ed4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/util/IssueExtractor.java
@@ -5,6 +5,7 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.PatchSet;
 import com.google.gerrit.extensions.api.GerritApi;
 import com.google.gerrit.extensions.client.ListChangesOption;
@@ -19,11 +20,9 @@
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class IssueExtractor {
-  private static final Logger log = LoggerFactory.getLogger(IssueExtractor.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final CommitMessageFetcher commitMessageFetcher;
   private final PatchSetDb db;
@@ -80,7 +79,7 @@
     Pattern pattern = itsConfig.getIssuePattern();
     if (pattern == null) return new String[] {};
 
-    log.debug("Matching '{}' against {}", haystack, pattern.pattern());
+    logger.atFine().log("Matching '%s' against '%s'", haystack, pattern.pattern());
 
     Set<String> issues = Sets.newHashSet();
     Matcher matcher = pattern.matcher(haystack);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java
index c5799d2..074b882 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/validation/ItsValidateComment.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.its.base.validation;
 
 import com.google.common.collect.Lists;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.server.events.CommitReceivedEvent;
@@ -30,12 +31,10 @@
 import java.util.Collections;
 import java.util.List;
 import org.eclipse.jgit.revwalk.RevCommit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class ItsValidateComment implements CommitValidationListener {
 
-  private static final Logger log = LoggerFactory.getLogger(ItsValidateComment.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Inject private ItsFacade client;
 
@@ -80,7 +79,7 @@
                   "Failed to check whether or not issue "
                       + issueId
                       + " exists, due to connectivity issue. Commit will be accepted.";
-              log.warn(synopsis, e);
+              logger.atWarning().withCause(e).log(synopsis);
               details = e.toString();
               existenceCheckResult = ItsExistenceCheckResult.CONNECTIVITY_FAILURE;
               ret.add(commitValidationFailure(synopsis, details, existenceCheckResult));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java
index 4af8f1b..f9214c6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionController.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.events.Event;
 import com.google.gerrit.server.events.EventListener;
 import com.google.gerrit.server.events.RefEvent;
@@ -23,8 +24,6 @@
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Controller that takes actions according to {@code ChangeEvents@}.
@@ -34,7 +33,7 @@
  */
 public class ActionController implements EventListener {
 
-  private static final Logger log = LoggerFactory.getLogger(ActionController.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final PropertyExtractor propertyExtractor;
   private final RuleBase ruleBase;
@@ -90,8 +89,8 @@
     }
     if (!projectProperties.containsKey("its-project")) {
       String project = projectProperties.get("project");
-      log.error(
-          "Could not process project event. No its-project associated with project {}. "
+      logger.atSevere().log(
+          "Could not process project event. No its-project associated with project %s. "
               + "Did you forget to configure the ITS project association in project.config?",
           project);
       return;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java
index b8682ad..3654e6f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ActionExecutor.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.registration.PluginName;
@@ -22,12 +23,10 @@
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacadeFactory;
 import java.io.IOException;
 import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Executes an {@link ActionRequest} */
 public class ActionExecutor {
-  private static final Logger log = LoggerFactory.getLogger(ActionExecutor.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final ItsFacadeFactory itsFactory;
   private final AddComment.Factory addCommentFactory;
@@ -95,7 +94,7 @@
         execute(action, issue, actionRequest, properties);
       }
     } catch (IOException e) {
-      log.error("Error while executing action " + actionRequest, e);
+      logger.atSevere().withCause(e).log("Error while executing action %s", actionRequest);
     }
   }
 
@@ -111,7 +110,7 @@
       String actionName = actionRequest.getName();
       Action action = getAction(actionName);
       if (action == null) {
-        log.debug("No action found for name {}", actionName);
+        logger.atFine().log("No action found for name %s", actionName);
         return;
       }
       if (action.getType() != ActionType.PROJECT) {
@@ -119,7 +118,7 @@
       }
       execute(action, itsProject, actionRequest, properties);
     } catch (IOException e) {
-      log.error("Error while executing action " + actionRequest, e);
+      logger.atSevere().withCause(e).log("Error while executing action %s", actionRequest);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java
index 7a259f1..3b1f356 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddPropertyToFieldParametersExtractor.java
@@ -15,17 +15,14 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Inject;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class AddPropertyToFieldParametersExtractor {
-
-  private static final Logger log =
-      LoggerFactory.getLogger(AddPropertyToFieldParametersExtractor.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Inject
   public AddPropertyToFieldParametersExtractor() {}
@@ -38,26 +35,26 @@
       ActionRequest actionRequest, Map<String, String> properties) {
     String[] parameters = actionRequest.getParameters();
     if (parameters.length != 2) {
-      log.error(
-          "Wrong number of received parameters. Received parameters are {}. Exactly two parameters are expected. The first one is the ITS field id, the second one is the event property id",
+      logger.atSevere().log(
+          "Wrong number of received parameters. Received parameters are %s. Exactly two parameters are expected. The first one is the ITS field id, the second one is the event property id",
           Arrays.toString(parameters));
       return Optional.empty();
     }
 
     String propertyId = parameters[0];
     if (Strings.isNullOrEmpty(propertyId)) {
-      log.error("Received property id is blank");
+      logger.atSevere().log("Received property id is blank");
       return Optional.empty();
     }
 
     String fieldId = parameters[1];
     if (Strings.isNullOrEmpty(fieldId)) {
-      log.error("Received field id is blank");
+      logger.atSevere().log("Received field id is blank");
       return Optional.empty();
     }
 
     if (!properties.containsKey(propertyId)) {
-      log.error("No event property found for id {}", propertyId);
+      logger.atSevere().log("No event property found for id %s", propertyId);
       return Optional.empty();
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java
index c29d622..3ee4ca8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/AddSoyComment.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.common.io.CharStreams;
 import com.google.inject.Inject;
 import com.google.inject.ProvisionException;
@@ -31,8 +32,6 @@
 import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Adds a short predefined comments to an issue.
@@ -40,7 +39,7 @@
  * <p>Comments are added for merging, abandoning, restoring of changes and adding of patch sets.
  */
 public class AddSoyComment extends IssueAction {
-  private static final Logger log = LoggerFactory.getLogger(AddSoyComment.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public interface Factory {
     AddSoyComment create();
@@ -99,7 +98,7 @@
     if (!template.isEmpty()) {
       return soyTextTemplate(SoyFileSet.builder(), template, properties);
     }
-    log.error("No template name given in {}", actionRequest);
+    logger.atSevere().log("No template name given in %s", actionRequest);
     return "";
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java
index 1eb01ce..3f81485 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/CreateVersionFromPropertyParametersExtractor.java
@@ -15,17 +15,14 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
 import javax.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class CreateVersionFromPropertyParametersExtractor {
-
-  private static final Logger log =
-      LoggerFactory.getLogger(CreateVersionFromPropertyParametersExtractor.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   @Inject
   public CreateVersionFromPropertyParametersExtractor() {}
@@ -34,20 +31,20 @@
       ActionRequest actionRequest, Map<String, String> properties) {
     String[] parameters = actionRequest.getParameters();
     if (parameters.length != 1) {
-      log.error(
-          "Wrong number of received parameters. Received parameters are {}. Only one parameter is expected, the property id.",
+      logger.atSevere().log(
+          "Wrong number of received parameters. Received parameters are %s. Only one parameter is expected, the property id.",
           Arrays.toString(parameters));
       return Optional.empty();
     }
 
     String propertyId = parameters[0];
     if (Strings.isNullOrEmpty(propertyId)) {
-      log.error("Received property id is blank");
+      logger.atSevere().log("Received property id is blank");
       return Optional.empty();
     }
 
     if (!properties.containsKey(propertyId)) {
-      log.error("No event property found for id {}", propertyId);
+      logger.atSevere().log("No event property found for id %s", propertyId);
       return Optional.empty();
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java
index 72fe43f..9790f7d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheImpl.java
@@ -17,6 +17,7 @@
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
@@ -34,12 +35,10 @@
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 public class ItsRulesProjectCacheImpl implements ItsRulesProjectCache {
-  private static final Logger log = LoggerFactory.getLogger(ItsRulesProjectCacheImpl.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
   private static final String CACHE_NAME = "its_rules_project";
 
   private final LoadingCache<String, List<Rule>> cache;
@@ -54,7 +53,8 @@
     try {
       return cache.get(projectName);
     } catch (ExecutionException e) {
-      log.warn("Cannot get project specific rules for project {}", projectName, e);
+      logger.atWarning().withCause(e).log(
+          "Cannot get project specific rules for project %s", projectName);
       return ImmutableList.of();
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
index 6d19849..75b91f7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
@@ -1,16 +1,15 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.RefNames;
 import com.google.gerrit.extensions.api.GerritApi;
 import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class ItsRulesProjectCacheRefresher implements GitReferenceUpdatedListener {
-  private static final Logger log = LoggerFactory.getLogger(ItsRulesProjectCacheRefresher.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final GerritApi gApi;
   private final ItsRulesProjectCache itsRuleProjectCache;
@@ -33,7 +32,7 @@
         itsRuleProjectCache.evict(childProject.name);
       }
     } catch (RestApiException e) {
-      log.warn("Unable to evict ITS rules cache", e);
+      logger.atWarning().withCause(e).log("Unable to evict ITS rules cache");
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java
index 6eec9a4..f345227 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/LogEvent.java
@@ -14,13 +14,12 @@
 
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacade;
 import java.io.IOException;
 import java.util.Map;
 import java.util.Map.Entry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Dumps the event's properties to the log.
@@ -28,7 +27,7 @@
  * <p>This event helps when developing rules as available properties become visible.
  */
 public class LogEvent extends IssueAction {
-  private static final Logger log = LoggerFactory.getLogger(LogEvent.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private enum Level {
     ERROR,
@@ -56,23 +55,25 @@
   public LogEvent() {}
 
   private void logProperty(Level level, Entry<String, String> property) {
-    String message = String.format("[%s = %s]", property.getKey(), property.getValue());
+    final java.util.logging.Level logLevel;
     switch (level) {
       case ERROR:
-        log.error(message);
+        logLevel = java.util.logging.Level.SEVERE;
         break;
       case WARN:
-        log.warn(message);
+        logLevel = java.util.logging.Level.WARNING;
         break;
       case INFO:
-        log.info(message);
+        logLevel = java.util.logging.Level.INFO;
         break;
       case DEBUG:
-        log.debug(message);
+        logLevel = java.util.logging.Level.FINE;
         break;
       default:
-        log.error("Undefined log level.");
+        logger.atSevere().log("Undefined log level.");
+        return;
     }
+    logger.at(logLevel).log("[%s = %s]", property.getKey(), property.getValue());
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java
index fa96242..b051dfe 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/RuleBase.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.its.base.GlobalRulesFileName;
 import com.googlesource.gerrit.plugins.its.base.ItsPath;
@@ -29,12 +30,10 @@
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
 import org.eclipse.jgit.util.FS;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Collection and matcher against {@link Rule}s. */
 public class RuleBase {
-  private static final Logger log = LoggerFactory.getLogger(RuleBase.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final File globalRuleFile;
   private final File itsSpecificRuleFile;
@@ -81,7 +80,7 @@
         cfg.load();
         return rulesConfigReader.getRulesFromConfig(cfg);
       } catch (IOException | ConfigInvalidException e) {
-        log.error("Invalid ITS action configuration", e);
+        logger.atSevere().withCause(e).log("Invalid ITS action configuration");
       }
     }
     return Collections.emptyList();
@@ -98,12 +97,10 @@
     Collection<Rule> fromProjectConfig = rulesProjectCache.get(projectName);
     Collection<Rule> rulesToAdd = !fromProjectConfig.isEmpty() ? fromProjectConfig : rules;
     if (rulesToAdd.isEmpty() && !globalRuleFile.exists() && !itsSpecificRuleFile.exists()) {
-      log.debug(
-          "Neither global rule file {} nor Its specific rule file {} exist and no rules are "
-              + "configured for project {}. Please configure rules.",
-          globalRuleFile,
-          itsSpecificRuleFile,
-          projectName);
+      logger.atFine().log(
+          "Neither global rule file %s nor Its specific rule file %s exist and no rules are "
+              + "configured for project %s. Please configure rules.",
+          globalRuleFile, itsSpecificRuleFile, projectName);
       return Collections.emptyList();
     }
     Collection<ActionRequest> actions = new ArrayList<>();
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
index 03dda08..e7a137a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/LoggingMockingTestCase.java
@@ -22,9 +22,9 @@
 import com.googlesource.gerrit.plugins.its.base.testutil.log.LogUtil;
 import java.sql.Timestamp;
 import java.util.Iterator;
+import java.util.logging.LogRecord;
 import junit.framework.TestCase;
 import org.apache.log4j.Level;
-import org.apache.log4j.spi.LoggingEvent;
 import org.junit.After;
 
 public abstract class LoggingMockingTestCase extends TestCase {
@@ -34,22 +34,21 @@
   protected final Change.Id testChangeId = Change.id(1);
   protected final Account.Id testAccountId = Account.id(1);
 
-  private java.util.Collection<LoggingEvent> loggedEvents;
+  private java.util.Collection<LogRecord> records;
 
   protected final void assertLogMessageContains(String needle, Level level) {
-    LoggingEvent hit = null;
-    Iterator<LoggingEvent> iter = loggedEvents.iterator();
+    LogRecord hit = null;
+    Iterator<LogRecord> iter = records.iterator();
     while (hit == null && iter.hasNext()) {
-      LoggingEvent event = iter.next();
-      if (event.getRenderedMessage().contains(needle)) {
-        if (level == null || level.equals(event.getLevel())) {
-          hit = event;
+      LogRecord record = iter.next();
+      if (record.getMessage().contains(needle)) {
+        if (level == null || LogUtil.equalLevels(record.getLevel(), level)) {
+          hit = record;
         }
       }
     }
     assertNotNull("Could not find log message containing '" + needle + "'", hit);
-    assertTrue(
-        "Could not remove log message containing '" + needle + "'", loggedEvents.remove(hit));
+    assertTrue("Could not remove log message containing '" + needle + "'", records.remove(hit));
   }
 
   protected final void assertLogMessageContains(String needle) {
@@ -57,31 +56,33 @@
   }
 
   protected final void assertLogThrowableMessageContains(String needle) {
-    LoggingEvent hit = null;
-    Iterator<LoggingEvent> iter = loggedEvents.iterator();
+    LogRecord hit = null;
+    Iterator<LogRecord> iter = records.iterator();
     while (hit == null && iter.hasNext()) {
-      LoggingEvent event = iter.next();
+      LogRecord record = iter.next();
 
-      if (event.getThrowableInformation().getThrowable().toString().contains(needle)) {
-        hit = event;
+      Throwable t = record.getThrown();
+      if (t != null && t.toString().contains(needle)) {
+        hit = record;
       }
     }
     assertNotNull("Could not find log message with a Throwable containing '" + needle + "'", hit);
     assertTrue(
         "Could not remove log message with a Throwable containing '" + needle + "'",
-        loggedEvents.remove(hit));
+        records.remove(hit));
   }
 
   // As the PowerMock runner does not pass through runTest, we inject log
   // verification through @After
   @After
   public final void assertNoUnassertedLogEvents() {
-    if (loggedEvents.size() > 0) {
-      LoggingEvent event = loggedEvents.iterator().next();
+    if (records.size() > 0) {
+      LogRecord record = records.iterator().next();
       String msg = "Found untreated logged events. First one is:\n";
-      msg += event.getRenderedMessage();
-      if (event.getThrowableInformation() != null) {
-        msg += "\n" + event.getThrowableInformation().getThrowable();
+      msg += record.getMessage();
+      Throwable t = record.getThrown();
+      if (t != null) {
+        msg += "\n" + t;
       }
       fail(msg);
     }
@@ -90,7 +91,7 @@
   @Override
   public void setUp() throws Exception {
     super.setUp();
-    loggedEvents = Lists.newArrayList();
+    records = Lists.newArrayList();
 
     // The logger we're interested is class name without the trailing "Test".
     // While this is not the most general approach it is sufficient for now,
@@ -98,7 +99,7 @@
     // to check.
     String logName = this.getClass().getCanonicalName();
     logName = logName.substring(0, logName.length() - 4);
-    LogUtil.logToCollection(logName, loggedEvents);
+    LogUtil.logToCollection(logName, records, Level.DEBUG);
   }
 
   @Override
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java
index c122676..8d918b2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/CollectionAppender.java
@@ -17,18 +17,19 @@
 import com.google.common.collect.Lists;
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.logging.LogRecord;
 import org.apache.log4j.AppenderSkeleton;
 import org.apache.log4j.spi.LoggingEvent;
 
 /** Log4j appender that logs into a list */
 public class CollectionAppender extends AppenderSkeleton {
-  private Collection<LoggingEvent> events;
+  private Collection<LogRecord> events;
 
   public CollectionAppender() {
     events = new LinkedList<>();
   }
 
-  public CollectionAppender(Collection<LoggingEvent> events) {
+  public CollectionAppender(Collection<LogRecord> events) {
     this.events = events;
   }
 
@@ -39,15 +40,20 @@
 
   @Override
   protected void append(LoggingEvent event) {
-    if (!events.add(event)) {
-      throw new RuntimeException("Could not append event " + event);
+    LogRecord logRecord = LogUtil.logRecordFromLog4jLoggingEvent(event);
+    append(logRecord);
+  }
+
+  public void append(LogRecord record) {
+    if (!events.add(record)) {
+      throw new RuntimeException("Could not append event " + record);
     }
   }
 
   @Override
   public void close() {}
 
-  public Collection<LoggingEvent> getLoggedEvents() {
+  public Collection<LogRecord> getLoggedEvents() {
     return Lists.newLinkedList(events);
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java
index 6cd633d..adccee8 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/base/testutil/log/LogUtil.java
@@ -14,18 +14,123 @@
 
 package com.googlesource.gerrit.plugins.its.base.testutil.log;
 
+import com.google.common.collect.ImmutableMap;
 import java.util.Collection;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.spi.LoggingEvent;
+import org.apache.log4j.spi.ThrowableInformation;
 
+/** Utility functions for dealing with various Loggers */
 public class LogUtil {
+  private static final ImmutableMap<org.apache.log4j.Level, Level> log4jToJul =
+      new ImmutableMap.Builder<org.apache.log4j.Level, Level>()
+          .put(org.apache.log4j.Level.OFF, Level.OFF)
+          .put(org.apache.log4j.Level.FATAL, Level.SEVERE)
+          .put(org.apache.log4j.Level.ERROR, Level.SEVERE)
+          .put(org.apache.log4j.Level.WARN, Level.WARNING)
+          .put(org.apache.log4j.Level.INFO, Level.INFO)
+          .put(org.apache.log4j.Level.DEBUG, Level.FINE)
+          .put(org.apache.log4j.Level.TRACE, Level.FINEST)
+          .put(org.apache.log4j.Level.ALL, Level.FINEST)
+          .build();
+
+  /**
+   * Makes sure that Loggers for a given name add their events to a collection
+   *
+   * <p>This is useful for capturing logged events during testing and being able to run assertions
+   * on them.
+   *
+   * <p>We will never be able to cover all possible backends of the Logging flavour of the day. For
+   * now we cover Log4j and JUL. If you use a different default logging backend, please send in
+   * patches.
+   *
+   * @param logName The name of the loggers to make log to the given collection.
+   * @param collection The collection to add log events to.
+   * @param level The level the logger should be set to.
+   */
   public static CollectionAppender logToCollection(
-      String logName, Collection<LoggingEvent> collection) {
+      String logName, Collection<LogRecord> collection, org.apache.log4j.Level level) {
+
+    CollectionAppender appender = new CollectionAppender(collection);
+
+    logToCollectionLog4j(logName, appender, level);
+    logToCollectionJul(logName, appender, log4jToJul.get(level));
+
+    return appender;
+  }
+
+  /**
+   * Make a Log4j logger log to a given appender at a certain level
+   *
+   * @param logName The logger that should log to the appender.
+   * @param appender The appender to log to.
+   * @param level The level to user for the logger.
+   */
+  private static void logToCollectionLog4j(
+      String logName, CollectionAppender appender, org.apache.log4j.Level level) {
     Logger log = LogManager.getLogger(logName);
-    CollectionAppender listAppender = new CollectionAppender(collection);
+    log.setLevel(level);
     log.removeAllAppenders();
-    log.addAppender(listAppender);
-    return listAppender;
+    log.addAppender(appender);
+  }
+
+  /**
+   * Make a java.util.logging logger log to a given appender at a certain level
+   *
+   * @param logName The logger that should log to the appender.
+   * @param appender The appender to log to.
+   * @param level The level to user for the logger.
+   */
+  private static void logToCollectionJul(String logName, CollectionAppender appender, Level level) {
+    java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(logName);
+    julLogger.setLevel(level);
+
+    julLogger.addHandler(
+        new Handler() {
+          @Override
+          public void publish(LogRecord record) {
+            appender.append(record);
+          }
+
+          @Override
+          public void flush() {}
+
+          @Override
+          public void close() throws SecurityException {}
+        });
+  }
+
+  /**
+   * Converts a Log4j Logging Event to a JUL LogRecord
+   *
+   * <p>This is not a full conversion, but covers only the fields we care about. That is the logged
+   * message and eventual thrown Throwables.
+   *
+   * @param event The Log4j LoggingEvent to convert
+   * @return The corresponding JUL LogRecord
+   */
+  public static LogRecord logRecordFromLog4jLoggingEvent(LoggingEvent event) {
+    LogRecord logRecord = new LogRecord(Level.ALL, event.getRenderedMessage());
+    ThrowableInformation tInfo = event.getThrowableInformation();
+    if (tInfo != null) {
+      logRecord.setThrown(tInfo.getThrowable());
+    }
+    return logRecord;
+  }
+
+  /**
+   * Check if a JUL and a Log4j Level correspond
+   *
+   * @param left The JUL Level to check.
+   * @param right The Log4j Level to check.
+   * @return True, if and only if the levels correspond.
+   */
+  public static boolean equalLevels(Level left, org.apache.log4j.Level right) {
+    Level julRight = log4jToJul.get(right);
+    return (left == null && right == null) || (left != null && left.equals(julRight));
   }
 }