diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java
index 46b48ae..cd034ad 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/DefaultHttpClientProvider.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.webhooks;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import java.security.KeyManagementException;
@@ -28,12 +29,10 @@
 import org.apache.http.conn.socket.PlainConnectionSocketFactory;
 import org.apache.http.conn.ssl.NoopHostnameVerifier;
 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /* HTTP client that doesn't verify remote's SSL certificate */
 class DefaultHttpClientProvider extends HttpClientProvider {
-  private static final Logger log = LoggerFactory.getLogger(DefaultHttpClientProvider.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   static final String DEFAULT = "default";
 
@@ -59,7 +58,7 @@
       context.init(null, trustAllCerts, null);
       return context;
     } catch (KeyManagementException | NoSuchAlgorithmException e) {
-      log.warn("Error building SSLContext object", e);
+      log.atWarning().withCause(e).log("Error building SSLContext object");
       return null;
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java
index ca35e36..986c84e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/EventHandler.java
@@ -17,6 +17,7 @@
 import static com.googlesource.gerrit.plugins.webhooks.RemoteConfig.REMOTE;
 
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.events.Event;
@@ -25,11 +26,9 @@
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.inject.Inject;
 import org.eclipse.jgit.lib.Config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class EventHandler implements EventListener {
-  private static final Logger log = LoggerFactory.getLogger(EventHandler.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   private final PluginConfigFactory configFactory;
   private final String pluginName;
@@ -61,17 +60,16 @@
           configFactory.getProjectPluginConfigWithInheritance(
               projectEvent.getProjectNameKey(), pluginName);
     } catch (NoSuchProjectException e) {
-      log.warn(
-          "Ignoring event for a non-existing project {}, {}",
-          projectEvent.getProjectNameKey().get(),
-          projectEvent);
+      log.atWarning().log(
+          "Ignoring event for a non-existing project %s, %s",
+          projectEvent.getProjectNameKey().get(), projectEvent);
       return;
     }
 
     for (String name : cfg.getSubsections(REMOTE)) {
       RemoteConfig remote = remoteFactory.create(cfg, name);
       if (Strings.isNullOrEmpty(remote.getUrl())) {
-        log.warn("remote.{}.url not defined, skipping this remote", name);
+        log.atWarning().log("remote.%s.url not defined, skipping this remote", name);
         continue;
       }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java
index aecb43a..f9afd02 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpClientProvider.java
@@ -14,6 +14,9 @@
 
 package com.googlesource.gerrit.plugins.webhooks;
 
+import static com.google.common.flogger.LazyArgs.lazy;
+
+import com.google.common.flogger.FluentLogger;
 import com.google.inject.Provider;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ServiceUnavailableRetryStrategy;
@@ -25,12 +28,10 @@
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 import org.apache.http.protocol.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /** Provides an HTTP client with SSL capabilities. */
 abstract class HttpClientProvider implements Provider<CloseableHttpClient> {
-  private static final Logger log = LoggerFactory.getLogger(HttpClientProvider.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
   private static final int CONNECTIONS_PER_ROUTE = 100;
   // Up to 2 target instances with the max number of connections per host:
   private static final int MAX_CONNECTIONS = 2 * CONNECTIONS_PER_ROUTE;
@@ -85,14 +86,9 @@
   }
 
   private void logRetry(String cause, HttpContext context) {
-    if (log.isDebugEnabled()) {
-      log.debug(
-          "Retrying request caused by '"
-              + cause
-              + "', request: '"
-              + context.getAttribute("http.request")
-              + "'");
-    }
+    log.atFine().log(
+        "Retrying request caused by '%s', request: '%s'",
+        cause, lazy(() -> context.getAttribute("http.request")));
   }
 
   private HttpClientConnectionManager create(
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java
index 0c23b6e..0c5bd24 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/HttpResponseHandler.java
@@ -18,14 +18,13 @@
 import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
 import static javax.servlet.http.HttpServletResponse.SC_OK;
 
+import com.google.common.flogger.FluentLogger;
 import com.googlesource.gerrit.plugins.webhooks.HttpResponseHandler.HttpResult;
 import java.io.IOException;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ResponseHandler;
 import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class HttpResponseHandler implements ResponseHandler<HttpResult> {
 
@@ -39,7 +38,7 @@
     }
   }
 
-  private static final Logger log = LoggerFactory.getLogger(HttpResponseHandler.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   @Override
   public HttpResult handleResponse(HttpResponse response) {
@@ -57,7 +56,7 @@
       try {
         return EntityUtils.toString(entity);
       } catch (IOException e) {
-        log.error("Error parsing entity", e);
+        log.atSevere().withCause(e).log("Error parsing entity");
       }
     }
     return "";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
index 0d7fd51..90c03b9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/PostTask.java
@@ -16,6 +16,7 @@
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
@@ -25,11 +26,9 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import javax.net.ssl.SSLException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class PostTask implements Runnable {
-  private static final Logger log = LoggerFactory.getLogger(PostTask.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
 
   interface Factory {
     PostTask create(ProjectEvent event, RemoteConfig remote);
@@ -71,7 +70,7 @@
     try {
       Optional<EventProcessor.Request> content = processor.get();
       if (!content.isPresent()) {
-        log.debug("No content. Webhook [{}] skipped.", remote.getUrl());
+        log.atFine().log("No content. Webhook [%s] skipped.", remote.getUrl());
         return;
       }
 
@@ -86,7 +85,7 @@
         logRetry(e);
         reschedule();
       } else {
-        log.error("Failed to post: {}", toString(), e);
+        log.atSevere().withCause(e).log("Failed to post: %s", toString());
       }
     }
   }
@@ -96,15 +95,12 @@
   }
 
   private void logRetry(String reason) {
-    if (log.isDebugEnabled()) {
-      log.debug("Retrying {} in {}ms. Reason: {}", toString(), remote.getRetryInterval(), reason);
-    }
+    log.atFine().log(
+        "Retrying %s in %dms. Reason: %s", toString(), remote.getRetryInterval(), reason);
   }
 
   private void logRetry(Throwable cause) {
-    if (log.isDebugEnabled()) {
-      log.debug("Retrying {} in {}ms. Cause: {}", toString(), remote.getRetryInterval(), cause);
-    }
+    log.atFine().withCause(cause).log("Retrying %s in %dms", toString(), remote.getRetryInterval());
   }
 
   @Override
