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));
   }
 }
