diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
index 9af6912..c8ac730 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/AutomergeChangeAction.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.automerger;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Change;
 import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -29,14 +30,12 @@
 import java.io.IOException;
 import java.util.Map;
 import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Implementation behind the "Recreate Automerges" button. */
 class AutomergeChangeAction
     implements UiAction<RevisionResource>,
         RestModifyView<RevisionResource, AutomergeChangeAction.Input> {
-  private static final Logger log = LoggerFactory.getLogger(AutomergeChangeAction.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private Provider<CurrentUser> user;
   private ConfigLoader config;
@@ -68,7 +67,7 @@
 
     Change change = rev.getChange();
     if (branchMap == null) {
-      log.debug("Branch map is empty for change {}", change.getKey().get());
+      logger.atFine().log("Branch map is empty for change %s", change.getKey().get());
       return Response.none();
     }
     String revision = rev.getPatchSet().commitId().name();
@@ -83,7 +82,7 @@
     mdsMergeInput.obsoleteRevision = revision;
     mdsMergeInput.currentRevision = revision;
 
-    log.debug("Multiple downstream merge input: {}", mdsMergeInput.dsBranchMap);
+    logger.atFine().log("Multiple downstream merge input: %s", mdsMergeInput.dsBranchMap);
 
     try {
       dsCreator.createMergesAndHandleConflicts(mdsMergeInput);
@@ -116,7 +115,7 @@
         desc = desc.setVisible(user.get() instanceof IdentifiedUser);
       }
     } catch (RestApiException | IOException | ConfigInvalidException e) {
-      log.error("Failed to recreate automerges for {} on {}", project, branch);
+      logger.atSevere().log("Failed to recreate automerges for %s on %s", project, branch);
       desc = desc.setVisible(false);
     }
     return desc;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
index e2abb1f..4d6dd8b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
@@ -17,6 +17,7 @@
 import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Account;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.api.GerritApi;
@@ -39,13 +40,11 @@
 import java.util.Set;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Class to read the config. */
 @Singleton
 public class ConfigLoader {
-  private static final Logger log = LoggerFactory.getLogger(ConfigLoader.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
   private static final String BRANCH_DELIMITER = ":";
   private static final String DEFAULT_CONFLICT_MESSAGE = "Merge conflict found on ${branch}";
 
@@ -194,10 +193,10 @@
       Set<String> projectSet = getManifestProjects(fromBranch, toBranch);
       projectSet = applyConfig(fromBranch, toBranch, projectSet);
 
-      log.debug("Project set for {} to {} is {}", fromBranch, toBranch, projectSet);
+      logger.atFine().log("Project set for %s to %s is %s", fromBranch, toBranch, projectSet);
       return projectSet;
     } catch (RestApiException | IOException e) {
-      log.error("Error reading manifest for {}!", fromBranch, e);
+      logger.atSevere().withCause(e).log("Error reading manifest for %s!", fromBranch);
       throw e;
     }
   }
@@ -362,7 +361,7 @@
       ManifestReader manifestReader = new ManifestReader(branch, manifestConfig.asString());
       return manifestReader.getProjects();
     } catch (ResourceNotFoundException e) {
-      log.debug("Manifest for {} not found", branch);
+      logger.atFine().log("Manifest for %s not found", branch);
       return new HashSet<>();
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
index 63416a4..5b06a9d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
@@ -16,6 +16,7 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 
 import com.google.common.base.Joiner;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.exceptions.StorageException;
 import com.google.gerrit.extensions.api.GerritApi;
 import com.google.gerrit.extensions.api.changes.AbandonInput;
@@ -55,8 +56,6 @@
 import java.util.TreeMap;
 import java.util.UUID;
 import org.eclipse.jgit.errors.ConfigInvalidException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * DownstreamCreator will receive an event on an uploaded, published, or restored patchset, and
@@ -70,7 +69,7 @@
         CommentAddedListener,
         RevisionCreatedListener,
         TopicEditedListener {
-  private static final Logger log = LoggerFactory.getLogger(DownstreamCreator.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
   private static final String AUTOMERGER_TAG = "autogenerated:Automerger";
   private static final String MERGE_CONFLICT_TAG = "autogenerated:MergeConflict";
   private static final String SUBJECT_PREFIX = "automerger";
@@ -106,10 +105,11 @@
               .revision(event.getRevision()._number)
               .commit(false)
               .commit;
-      log.debug("Detected revision {} abandoned on {}.", revision, change.project);
+      logger.atFine().log("Detected revision %s abandoned on %s.", revision, change.project);
       abandonDownstream(change, revision);
     } catch (ConfigInvalidException | StorageException | RestApiException e) {
-      log.error("Automerger plugin failed onChangeAbandoned for {}", event.getChange().id, e);
+      logger.atSevere().withCause(e).log(
+          "Automerger plugin failed onChangeAbandoned for %s", event.getChange().id);
     }
   }
 
@@ -130,7 +130,8 @@
                 .id(eventChange._number)
                 .get(EnumSet.of(ListChangesOption.CURRENT_REVISION));
       } catch (RestApiException e) {
-        log.error("Automerger could not get change with current revision for onTopicEdited: ", e);
+        logger.atSevere().withCause(e).log(
+            "Automerger could not get change with current revision for onTopicEdited.");
         return;
       }
       String oldTopic = event.getOldTopic();
@@ -139,12 +140,13 @@
       try {
         downstreamBranches = config.getDownstreamBranches(change.branch, change.project);
       } catch (RestApiException | IOException | ConfigInvalidException e) {
-        log.error("Failed to edit downstream topics of {}", change.id, e);
+        logger.atSevere().withCause(e).log("Failed to edit downstream topics of %s", change.id);
         return;
       }
 
       if (downstreamBranches.isEmpty()) {
-        log.debug("Downstream branches of {} on {} are empty", change.branch, change.project);
+        logger.atFine().log(
+            "Downstream branches of %s on %s are empty", change.branch, change.project);
         return;
       }
 
@@ -159,7 +161,8 @@
           reviewInput.notify = NotifyHandling.NONE;
           gApi.changes().id(change._number).revision(CURRENT).review(reviewInput);
         } catch (RestApiException e) {
-          log.error("Failed to prevent setting empty topic for automerger plugin.", e);
+          logger.atSevere().withCause(e).log(
+              "Failed to prevent setting empty topic for automerger plugin.");
         }
       } else {
         for (String downstreamBranch : downstreamBranches) {
@@ -167,16 +170,17 @@
             List<Integer> existingDownstream =
                 getExistingMergesOnBranch(revision, oldTopic, downstreamBranch);
             for (Integer changeNumber : existingDownstream) {
-              log.debug("Setting topic {} on {}", change.topic, changeNumber);
+              logger.atFine().log("Setting topic %s on %s", change.topic, changeNumber);
               gApi.changes().id(changeNumber).topic(change.topic);
             }
           } catch (RestApiException | InvalidQueryParameterException e) {
-            log.error("Failed to edit downstream topics of {}", change.id, e);
+            logger.atSevere().withCause(e).log("Failed to edit downstream topics of %s", change.id);
           }
         }
       }
     } catch (StorageException | ConfigInvalidException e) {
-      log.error("Automerger plugin failed onTopicEdited for {}", event.getChange().id, e);
+      logger.atSevere().withCause(e).log(
+          "Automerger plugin failed onTopicEdited for %s", event.getChange().id);
     }
   }
 
@@ -190,8 +194,8 @@
     try (ManualRequestContext ctx = oneOffRequestContext.openAs(config.getContextUserId())) {
       RevisionInfo eventRevision = event.getRevision();
       if (!eventRevision.isCurrent) {
-        log.info(
-            "Not updating downstream votes since revision {} is not current.",
+        logger.atInfo().log(
+            "Not updating downstream votes since revision %s is not current.",
             eventRevision._number);
         return;
       }
@@ -201,7 +205,8 @@
       downstreamBranches = config.getDownstreamBranches(change.branch, change.project);
 
       if (downstreamBranches.isEmpty()) {
-        log.debug("Downstream branches of {} on {} are empty", change.branch, change.project);
+        logger.atFine().log(
+            "Downstream branches of %s on %s are empty", change.branch, change.project);
         return;
       }
 
@@ -233,11 +238,13 @@
             }
           }
         } catch (RestApiException | InvalidQueryParameterException e) {
-          log.error("Exception when updating downstream votes of {}", change.id, e);
+          logger.atSevere().withCause(e).log(
+              "Exception when updating downstream votes of %s", change.id);
         }
       }
     } catch (StorageException | ConfigInvalidException | RestApiException | IOException e) {
-      log.error("Automerger plugin failed onCommentAdded for {}", event.getChange().id, e);
+      logger.atSevere().withCause(e).log(
+          "Automerger plugin failed onCommentAdded for %s", event.getChange().id);
     }
   }
 
@@ -256,7 +263,8 @@
         | ConfigInvalidException
         | InvalidQueryParameterException
         | StorageException e) {
-      log.error("Automerger plugin failed onChangeRestored for {}", event.getChange().id, e);
+      logger.atSevere().withCause(e).log(
+          "Automerger plugin failed onChangeRestored for %s", event.getChange().id);
     }
   }
 
@@ -275,7 +283,8 @@
         | ConfigInvalidException
         | InvalidQueryParameterException
         | StorageException e) {
-      log.error("Automerger plugin failed onRevisionCreated for {}", event.getChange().id, e);
+      logger.atSevere().withCause(e).log(
+          "Automerger plugin failed onRevisionCreated for %s", event.getChange().id);
     }
   }
 
@@ -284,7 +293,7 @@
     try (ManualRequestContext ctx = oneOffRequestContext.openAs(config.getContextUserId())) {
       if (isNullOrEmpty(topic)) {
         topic = "am-" + UUID.randomUUID();
-        log.debug("Setting original change {} topic to {}", sourceId, topic);
+        logger.atFine().log("Setting original change %s topic to %s", sourceId, topic);
         gApi.changes().id(sourceId).topic(topic);
       }
       return topic;
@@ -367,10 +376,9 @@
               getExistingMergesOnBranch(
                   mdsMergeInput.obsoleteRevision, mdsMergeInput.topic, downstreamBranch);
           if (!existingDownstream.isEmpty()) {
-            log.debug(
-                "Attempting to update downstream merge of {} on branch {}",
-                mdsMergeInput.currentRevision,
-                downstreamBranch);
+            logger.atFine().log(
+                "Attempting to update downstream merge of %s on branch %s",
+                mdsMergeInput.currentRevision, downstreamBranch);
             // existingDownstream should almost always be of length one, but
             // it's possible to construct it so that it's not
             for (Integer dsChangeNumber : existingDownstream) {
@@ -385,18 +393,17 @@
                 createDownstreams = false;
               } catch (MergeConflictException e) {
                 failedMergeBranchMap.put(downstreamBranch, e.getMessage());
-                log.debug(
-                    "Abandoning existing, obsolete {} due to merge conflict.", dsChangeNumber);
+                logger.atFine().log(
+                    "Abandoning existing, obsolete %s due to merge conflict.", dsChangeNumber);
                 abandonChange(dsChangeNumber);
               }
             }
           }
         }
         if (createDownstreams) {
-          log.debug(
-              "Attempting to create downstream merge of {} on branch {}",
-              mdsMergeInput.currentRevision,
-              downstreamBranch);
+          logger.atFine().log(
+              "Attempting to create downstream merge of %s on branch %s",
+              mdsMergeInput.currentRevision, downstreamBranch);
           SingleDownstreamMergeInput sdsMergeInput = new SingleDownstreamMergeInput();
           sdsMergeInput.currentRevision = mdsMergeInput.currentRevision;
           sdsMergeInput.changeNumber = mdsMergeInput.changeNumber;
@@ -482,10 +489,9 @@
       String currentTopic = getOrSetTopic(sdsMergeInput.changeNumber, sdsMergeInput.topic);
 
       if (isAlreadyMerged(sdsMergeInput, currentTopic)) {
-        log.info(
-            "Commit {} already merged into {}, not automerging again.",
-            sdsMergeInput.currentRevision,
-            sdsMergeInput.downstreamBranch);
+        logger.atInfo().log(
+            "Commit %s already merged into %s, not automerging again.",
+            sdsMergeInput.currentRevision, sdsMergeInput.downstreamBranch);
         return;
       }
 
@@ -493,7 +499,7 @@
       mergeInput.source = sdsMergeInput.currentRevision;
       mergeInput.strategy = "recursive";
 
-      log.debug("Creating downstream merge for {}", sdsMergeInput.currentRevision);
+      logger.atFine().log("Creating downstream merge for %s", sdsMergeInput.currentRevision);
       ChangeInput downstreamChangeInput = new ChangeInput();
       downstreamChangeInput.project = sdsMergeInput.project;
       downstreamChangeInput.branch = sdsMergeInput.downstreamBranch;
@@ -513,10 +519,9 @@
         downstreamChangeInput.subject =
             getSubjectForDownstreamMerge(
                 sdsMergeInput.subject, sdsMergeInput.currentRevision, true);
-        log.debug(
-            "Skipping merge for {} to {}",
-            sdsMergeInput.currentRevision,
-            sdsMergeInput.downstreamBranch);
+        logger.atFine().log(
+            "Skipping merge for %s to %s",
+            sdsMergeInput.currentRevision, sdsMergeInput.downstreamBranch);
       }
 
       ChangeApi downstreamChange = gApi.changes().create(downstreamChangeInput);
@@ -539,7 +544,7 @@
   private String getBaseChangeId(List<String> parents, String branch)
       throws InvalidQueryParameterException, RestApiException {
     if (parents.isEmpty()) {
-      log.info("No base change id for change with no parents.");
+      logger.atInfo().log("No base change id for change with no parents.");
       return null;
     }
     // 1) Get topic of first parent
@@ -565,13 +570,14 @@
           StorageException {
     String currentRevision =
         gApi.changes().id(change._number).revision(revisionInfo._number).commit(false).commit;
-    log.debug(
-        "Handling patchsetevent with change id {} and revision {}", change.id, currentRevision);
+    logger.atFine().log(
+        "Handling patchsetevent with change id %s and revision %s", change.id, currentRevision);
 
     Set<String> downstreamBranches = config.getDownstreamBranches(change.branch, change.project);
 
     if (downstreamBranches.isEmpty()) {
-      log.debug("Downstream branches of {} on {} are empty", change.branch, change.project);
+      logger.atFine().log(
+          "Downstream branches of %s on %s are empty", change.branch, change.project);
       return;
     }
 
@@ -581,7 +587,7 @@
       boolean isSkipMerge = config.isSkipMerge(change.branch, downstreamBranch, change.subject);
       dsBranchMap.put(downstreamBranch, !isSkipMerge);
     }
-    log.debug("Automerging change {} from branch {}", change.id, change.branch);
+    logger.atFine().log("Automerging change %s from branch %s", change.id, change.branch);
 
     ChangeApi currentChange = gApi.changes().id(change._number);
     String previousRevision = getPreviousRevision(currentChange, revisionInfo._number);
@@ -604,25 +610,26 @@
     try {
       Set<String> downstreamBranches = config.getDownstreamBranches(change.branch, change.project);
       if (downstreamBranches.isEmpty()) {
-        log.debug("Downstream branches of {} on {} are empty", change.branch, change.project);
+        logger.atFine().log(
+            "Downstream branches of %s on %s are empty", change.branch, change.project);
         return;
       }
 
       for (String downstreamBranch : downstreamBranches) {
         List<Integer> existingDownstream =
             getExistingMergesOnBranch(revision, change.topic, downstreamBranch);
-        log.debug("Abandoning existing downstreams: {}", existingDownstream);
+        logger.atFine().log("Abandoning existing downstreams: %s", existingDownstream);
         for (Integer changeNumber : existingDownstream) {
           abandonChange(changeNumber);
         }
       }
     } catch (RestApiException | IOException | InvalidQueryParameterException e) {
-      log.error("Failed to abandon downstreams of {}", change.id, e);
+      logger.atSevere().withCause(e).log("Failed to abandon downstreams of %s", change.id);
     }
   }
 
   private void updateVote(ChangeInfo change, String label, short vote) throws RestApiException {
-    log.debug("Giving {} for label {} to {}", vote, label, change.id);
+    logger.atFine().log("Giving %s for label %s to %s", vote, label, change.id);
     // Vote on all downstream branches unless merge conflict.
     ReviewInput reviewInput = new ReviewInput();
     Map<String, Short> labels = new HashMap<>();
@@ -633,7 +640,7 @@
     try {
       gApi.changes().id(change.id).revision(CURRENT).review(reviewInput);
     } catch (AuthException e) {
-      log.error("Automerger could not set label, but still continuing.", e);
+      logger.atSevere().withCause(e).log("Automerger could not set label, but still continuing.");
     }
   }
 
@@ -645,7 +652,7 @@
     try {
       gApi.changes().id(change.id).revision(CURRENT).review(reviewInput);
     } catch (AuthException e) {
-      log.error("Automerger could not set label, but still continuing.", e);
+      logger.atSevere().withCause(e).log("Automerger could not set label, but still continuing.");
     }
   }
 
@@ -668,7 +675,7 @@
       mergeInput.strategy = "ours";
       mergePatchSetInput.subject =
           getSubjectForDownstreamMerge(upstreamSubject, newParentRevision, true);
-      log.debug("Skipping merge for {} on {}", newParentRevision, sourceNum);
+      logger.atFine().log("Skipping merge for %s on %s", newParentRevision, sourceNum);
     }
     mergePatchSetInput.merge = mergeInput;
 
@@ -737,7 +744,7 @@
   }
 
   private void abandonChange(Integer changeNumber) throws RestApiException {
-    log.debug("Abandoning change: {}", changeNumber);
+    logger.atFine().log("Abandoning change: %s", changeNumber);
     AbandonInput abandonInput = new AbandonInput();
     abandonInput.notify = NotifyHandling.NONE;
     abandonInput.message = "Merge parent updated; abandoning due to upstream conflict.";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/ManifestReader.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/ManifestReader.java
index a71e1c0..37b6f92 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/ManifestReader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/ManifestReader.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.automerger;
 
+import com.google.common.flogger.FluentLogger;
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.HashSet;
@@ -21,8 +22,6 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -32,7 +31,7 @@
 
 /** Class to read a repo manifest. */
 public class ManifestReader {
-  private static final Logger log = LoggerFactory.getLogger(ManifestReader.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final String manifestString;
   private final String branch;
@@ -79,7 +78,7 @@
       }
 
     } catch (SAXException | ParserConfigurationException | IOException e) {
-      log.error("Exception on manifest for branch {}", branch, e);
+      logger.atSevere().withCause(e).log("Exception on manifest for branch %s", branch);
     }
     return projectSet;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/MergeValidator.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/MergeValidator.java
index 6a27eeb..16459a6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/MergeValidator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/MergeValidator.java
@@ -16,6 +16,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.common.data.ParameterizedString;
 import com.google.gerrit.entities.BranchNameKey;
 import com.google.gerrit.entities.PatchSet;
@@ -41,15 +42,13 @@
 import java.util.Set;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Repository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * MergeValidator will validate that all downstream changes are uploaded for review before
  * submission.
  */
 public class MergeValidator implements MergeValidationListener {
-  private static final Logger log = LoggerFactory.getLogger(MergeValidator.class);
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   protected GerritApi gApi;
   protected ConfigLoader config;
@@ -82,7 +81,7 @@
         | IOException
         | ConfigInvalidException
         | InvalidQueryParameterException e) {
-      log.error("Automerger plugin failed onPreMerge for {}", changeId, e);
+      logger.atSevere().withCause(e).log("Automerger plugin failed onPreMerge for %s", changeId);
       e.printStackTrace();
       throw new MergeValidationException("Error when validating merge for: " + changeId);
     }
