This is an automated email from the ASF dual-hosted git repository.

merlimat pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 22a37eccdd BP-69: Convert stats and allocator modules to slog (phase 
2) (#4755)
22a37eccdd is described below

commit 22a37eccdd7b167900084c66f50fd4b54311d8a7
Author: Matteo Merli <[email protected]>
AuthorDate: Tue Apr 28 08:20:34 2026 -0700

    BP-69: Convert stats and allocator modules to slog (phase 2) (#4755)
    
    * BP-69 base: add slog dependency and LICENSE entries
    
    Minimal scaffolding commit for the BP-69 slog migration series:
    
    - Add `io.github.merlimat.slog:slog:0.9.7` to the root pom.xml
      dependencyManagement and to the global compile classpath alongside
      the existing SLF4J API (which stays as the rendering backend).
    - Add lombok.config at the repo root so `@CustomLog` generates a slog
      `Logger` instead of an SLF4J one.
    - Register the slog jar in LICENSE-all.bin.txt, LICENSE-server.bin.txt
      and LICENSE-bkctl.bin.txt so the CI check-binary-license script
      finds it accounted for in the bundled-jars list.
    
    No actual Java file is converted in this commit. Individual module
    migrations stack on top of this one.
    
    * BP-69: Convert stats and allocator modules from SLF4J to slog
    
    Part of BP-69. Converts the stats-api, codahale/otel/prometheus metrics
    providers, stats-utils, and bookkeeper-common-allocator modules.
    
    * Fix checkstyle ImportOrder violations
    
    * Bump slog dependency to 0.9.8
    
    Pulls in the MDC propagation fix from merlimat/slog#6, which makes
    log4j2 ThreadContext entries visible on slog events emitted via the
    Log4j2Logger backend (so %X{key} layouts and appenders that read
    event.getContextData().getValue(key) see the caller's MDC).
---
 .../allocator/impl/ByteBufAllocatorImpl.java       | 16 +++++--------
 .../apache/bookkeeper/stats/AlertStatsLogger.java  |  8 +++----
 .../java/org/apache/bookkeeper/stats/Stats.java    | 28 +++++++++++++++-------
 .../apache/bookkeeper/stats/ThreadRegistry.java    | 10 ++++----
 .../stats/codahale/CodahaleMetricsProvider.java    | 13 +++++-----
 .../bookkeeper/stats/otel/OtelMetricsProvider.java |  6 ++---
 .../prometheus/PrometheusMetricsProvider.java      | 16 +++++--------
 .../ThreadScopedDataSketchesStatsLogger.java       | 26 ++++++++++----------
 .../bookkeeper/stats/utils/StatsDocGenerator.java  | 21 +++++++++-------
 .../apache/distributedlog/BKAsyncLogReader.java    |  4 ++--
 .../apache/distributedlog/BKLogSegmentWriter.java  |  4 ++--
 .../distributedlog/ReadAheadEntryReader.java       |  2 +-
 12 files changed, 80 insertions(+), 74 deletions(-)

diff --git 
a/bookkeeper-common-allocator/src/main/java/org/apache/bookkeeper/common/allocator/impl/ByteBufAllocatorImpl.java
 
b/bookkeeper-common-allocator/src/main/java/org/apache/bookkeeper/common/allocator/impl/ByteBufAllocatorImpl.java
index 3bc06f8e7e..97880cfaba 100644
--- 
a/bookkeeper-common-allocator/src/main/java/org/apache/bookkeeper/common/allocator/impl/ByteBufAllocatorImpl.java
+++ 
b/bookkeeper-common-allocator/src/main/java/org/apache/bookkeeper/common/allocator/impl/ByteBufAllocatorImpl.java
@@ -25,21 +25,19 @@ import io.netty.buffer.UnpooledByteBufAllocator;
 import io.netty.util.ResourceLeakDetector;
 import io.netty.util.ResourceLeakDetector.Level;
 import java.util.function.Consumer;
+import lombok.CustomLog;
 import org.apache.bookkeeper.common.allocator.ByteBufAllocatorWithOomHandler;
 import org.apache.bookkeeper.common.allocator.LeakDetectionPolicy;
 import org.apache.bookkeeper.common.allocator.OutOfMemoryPolicy;
 import org.apache.bookkeeper.common.allocator.PoolingPolicy;
 import org.apache.bookkeeper.common.util.ShutdownUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Implementation of {@link ByteBufAllocator}.
  */
+@CustomLog
 public class ByteBufAllocatorImpl extends AbstractByteBufAllocator implements 
ByteBufAllocatorWithOomHandler {
 
-    private static final Logger log = 
LoggerFactory.getLogger(ByteBufAllocatorImpl.class);
-
     // Same as AbstractByteBufAllocator, but copied here since it's not visible
     private static final int DEFAULT_INITIAL_CAPACITY = 256;
     private static final int DEFAULT_MAX_CAPACITY = Integer.MAX_VALUE;
@@ -69,7 +67,7 @@ public class ByteBufAllocatorImpl extends 
AbstractByteBufAllocator implements By
         this.exitOnOutOfMemory = exitOnOutOfMemory;
         if (outOfMemoryListener == null) {
             this.outOfMemoryListener = (v) -> {
-                log.error("Unable to allocate memory", v);
+                log.error().exception(v).log("Unable to allocate memory");
             };
         } else {
             this.outOfMemoryListener = outOfMemoryListener;
@@ -105,9 +103,7 @@ public class ByteBufAllocatorImpl extends 
AbstractByteBufAllocator implements By
         // allocators
         switch (leakDetectionPolicy) {
         case Disabled:
-            if (log.isDebugEnabled()) {
-                log.debug("Disable Netty allocator leak detector");
-            }
+            log.debug("Disable Netty allocator leak detector");
             ResourceLeakDetector.setLevel(Level.DISABLED);
             break;
 
@@ -201,10 +197,10 @@ public class ByteBufAllocatorImpl extends 
AbstractByteBufAllocator implements By
         try {
             outOfMemoryListener.accept(outOfMemoryError);
         } catch (Throwable e) {
-            log.warn("Consume outOfMemory error failed.", e);
+            log.warn().exception(e).log("Consume outOfMemory error failed");
         }
         if (exitOnOutOfMemory) {
-            log.info("Exiting JVM process for OOM error: {}", 
outOfMemoryError.getMessage(), outOfMemoryError);
+            log.info().exception(outOfMemoryError).log("Exiting JVM process 
for OOM error");
             ShutdownUtil.triggerImmediateForcefulShutdown();
         }
     }
diff --git 
a/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/AlertStatsLogger.java
 
b/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/AlertStatsLogger.java
index 9b79449ec4..06f51647a7 100644
--- 
a/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/AlertStatsLogger.java
+++ 
b/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/AlertStatsLogger.java
@@ -16,14 +16,13 @@
  */
 package org.apache.bookkeeper.stats;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.CustomLog;
 
 /**
  * This class is used to raise alert when we detect an event that should never 
happen in production.
  */
+@CustomLog
 public class AlertStatsLogger {
-    private static final Logger logger = 
LoggerFactory.getLogger(AlertStatsLogger.class);
 
     public final String alertStatName;
 
@@ -73,7 +72,6 @@ public class AlertStatsLogger {
         if (null != scopedCounter) {
             scopedCounter.inc();
         }
-        logger.error(format(msg), args);
-        logger.error("fake exception to generate stack trace", new 
Exception());
+        log.error().exception(new Exception()).logf(format(msg), args);
     }
 }
diff --git 
a/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/Stats.java
 
b/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/Stats.java
index 390925a32b..8f6c9eda61 100644
--- 
a/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/Stats.java
+++ 
b/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/Stats.java
@@ -23,15 +23,14 @@ package org.apache.bookkeeper.stats;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import lombok.CustomLog;
 import org.apache.commons.configuration2.Configuration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * An umbrella class for loading stats provider.
  */
+@CustomLog
 public class Stats {
-    static final Logger LOG = LoggerFactory.getLogger(Stats.class);
     public static final String STATS_PROVIDER_CLASS = "statsProviderClass";
 
     static StatsProvider prov = new NullStatsProvider();
@@ -50,16 +49,27 @@ public class Stats {
                     (Constructor<? extends StatsProvider>) 
cls.getDeclaredConstructor();
                 prov = cons.newInstance();
             } catch (ClassNotFoundException cnfe) {
-                LOG.error("Couldn't find configured class(" + className + ")", 
cnfe);
+                log.error()
+                        .exception(cnfe)
+                        .attr("className", className)
+                        .log("Couldn't find configured class");
             } catch (NoSuchMethodException nsme) {
-                LOG.error("Couldn't find default constructor for class (" + 
className + ")", nsme);
+                log.error()
+                        .exception(nsme)
+                        .attr("className", className)
+                        .log("Couldn't find default constructor for class");
             } catch (InstantiationException ie) {
-                LOG.error("Couldn't construct class (" + className + ")", ie);
+                log.error()
+                        .exception(ie)
+                        .attr("className", className)
+                        .log("Couldn't construct class");
             } catch (IllegalAccessException iae) {
-                LOG.error("Couldn't construct class (" + className + "),"
-                          + " Is the constructor private?", iae);
+                log.error()
+                        .exception(iae)
+                        .attr("className", className)
+                        .log("Couldn't construct class, is the constructor 
private?");
             } catch (InvocationTargetException ite) {
-                LOG.error("Constructor threw an exception. It should not 
have.", ite);
+                log.error().exception(ite).log("Constructor threw an 
exception. It should not have.");
             }
         }
     }
diff --git 
a/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/ThreadRegistry.java
 
b/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/ThreadRegistry.java
index 5bc7259a09..ca6fa0dc97 100644
--- 
a/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/ThreadRegistry.java
+++ 
b/stats/bookkeeper-stats-api/src/main/java/org/apache/bookkeeper/stats/ThreadRegistry.java
@@ -18,8 +18,7 @@ package org.apache.bookkeeper.stats;
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.CustomLog;
 
 /**
  * For mapping thread ids to thread pools and threads within those pools
@@ -27,8 +26,8 @@ import org.slf4j.LoggerFactory;
  * metrics by retrieving the ThreadPoolThread object from this registry.
  * For flexibility, this registry is not based on TLS.
  */
+@CustomLog
 public class ThreadRegistry {
-    private static Logger logger = 
LoggerFactory.getLogger(ThreadRegistry.class);
     private static ConcurrentMap<Long, ThreadPoolThread> threadPoolMap = new 
ConcurrentHashMap<>();
     private static ConcurrentMap<String, Integer> threadPoolThreadMap = new 
ConcurrentHashMap<>();
 
@@ -59,7 +58,10 @@ public class ThreadRegistry {
     public static void forceClearRegistrationForTests(long threadId) {
         threadPoolMap.compute(threadId, (id, value) -> {
             if (value !=  null) {
-                logger.info("Forcibly clearing registry entry {} for thread id 
{}", value, id);
+                log.info()
+                        .attr("entry", value)
+                        .attr("threadId", id)
+                        .log("Forcibly clearing registry entry");
             }
            return null;
         });
diff --git 
a/stats/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java
 
b/stats/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java
index 65e8c230f5..ad46a021cb 100644
--- 
a/stats/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java
+++ 
b/stats/bookkeeper-stats-providers/codahale-metrics-provider/src/main/java/org/apache/bookkeeper/stats/codahale/CodahaleMetricsProvider.java
@@ -33,21 +33,20 @@ import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import lombok.CustomLog;
 import org.apache.bookkeeper.stats.StatsLogger;
 import org.apache.bookkeeper.stats.StatsProvider;
 import org.apache.bookkeeper.stats.ThreadRegistry;
 import org.apache.commons.configuration2.Configuration;
-import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * A {@link StatsProvider} implemented based on <i>Codahale</i> metrics 
library.
  */
 @SuppressWarnings("deprecation")
+@CustomLog
 public class CodahaleMetricsProvider implements StatsProvider {
 
-    static final Logger LOG = 
LoggerFactory.getLogger(CodahaleMetricsProvider.class);
-
     MetricRegistry metrics = null;
     List<ScheduledReporter> reporters = new ArrayList<ScheduledReporter>();
     JmxReporter jmx = null;
@@ -76,7 +75,7 @@ public class CodahaleMetricsProvider implements StatsProvider 
{
         String jmxDomain = conf.getString("codahaleStatsJmxEndpoint");
 
         if (!Strings.isNullOrEmpty(graphiteHost)) {
-            LOG.info("Configuring stats with graphite");
+            log.info("Configuring stats with graphite");
             HostAndPort addr = HostAndPort.fromString(graphiteHost);
             final Graphite graphite = new Graphite(
                     new InetSocketAddress(addr.getHost(), addr.getPort()));
@@ -97,14 +96,14 @@ public class CodahaleMetricsProvider implements 
StatsProvider {
             } else {
                 outdir = new File(csvDir);
             }
-            LOG.info("Configuring stats with csv output to directory [{}]", 
outdir.getAbsolutePath());
+            log.info().attr("directory", 
outdir.getAbsolutePath()).log("Configuring stats with csv output");
             reporters.add(CsvReporter.forRegistry(getMetrics())
                           .convertRatesTo(TimeUnit.SECONDS)
                           .convertDurationsTo(TimeUnit.MILLISECONDS)
                           .build(outdir));
         }
         if (!Strings.isNullOrEmpty(slf4jCat)) {
-            LOG.info("Configuring stats with slf4j");
+            log.info("Configuring stats with slf4j");
             reporters.add(Slf4jReporter.forRegistry(getMetrics())
                           .outputTo(LoggerFactory.getLogger(slf4jCat))
                           .convertRatesTo(TimeUnit.SECONDS)
@@ -112,7 +111,7 @@ public class CodahaleMetricsProvider implements 
StatsProvider {
                           .build());
         }
         if (!Strings.isNullOrEmpty(jmxDomain)) {
-            LOG.info("Configuring stats with jmx");
+            log.info("Configuring stats with jmx");
             jmx = JmxReporter.forRegistry(getMetrics())
                 .inDomain(jmxDomain)
                 .convertRatesTo(TimeUnit.SECONDS)
diff --git 
a/stats/bookkeeper-stats-providers/otel-metrics-provider/src/main/java/org/apache/bookkeeper/stats/otel/OtelMetricsProvider.java
 
b/stats/bookkeeper-stats-providers/otel-metrics-provider/src/main/java/org/apache/bookkeeper/stats/otel/OtelMetricsProvider.java
index 817db0aa78..f812151d6d 100644
--- 
a/stats/bookkeeper-stats-providers/otel-metrics-provider/src/main/java/org/apache/bookkeeper/stats/otel/OtelMetricsProvider.java
+++ 
b/stats/bookkeeper-stats-providers/otel-metrics-provider/src/main/java/org/apache/bookkeeper/stats/otel/OtelMetricsProvider.java
@@ -43,13 +43,13 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Supplier;
-import lombok.extern.slf4j.Slf4j;
+import lombok.CustomLog;
 import org.apache.bookkeeper.stats.StatsLogger;
 import org.apache.bookkeeper.stats.StatsProvider;
 import org.apache.commons.configuration2.Configuration;
 // CHECKSTYLE.ON: IllegalImport
 
-@Slf4j
+@CustomLog
 public class OtelMetricsProvider implements StatsProvider {
 
     private static final String METER_NAME = "org.apache.bookkeeper";
@@ -136,7 +136,7 @@ public class OtelMetricsProvider implements StatsProvider {
                 field.setAccessible(true);
                 tmpDirectMemoryUsage = (AtomicLong) field.get(null);
             } catch (Throwable t) {
-                log.warn("Failed to access netty DIRECT_MEMORY_COUNTER field 
{}", t.getMessage());
+                log.warn().exceptionMessage(t).log("Failed to access netty 
DIRECT_MEMORY_COUNTER field");
             }
             directMemoryUsage = tmpDirectMemoryUsage;
             getDirectMemoryUsage = () -> directMemoryUsage != null ? 
directMemoryUsage.get() : Double.NaN;
diff --git 
a/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
 
b/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
index 8fa56ce5ff..c1537d65d0 100644
--- 
a/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
+++ 
b/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
@@ -44,6 +44,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Supplier;
+import lombok.CustomLog;
 import org.apache.bookkeeper.stats.StatsLogger;
 import org.apache.bookkeeper.stats.StatsProvider;
 import org.apache.bookkeeper.stats.ThreadRegistry;
@@ -52,13 +53,12 @@ import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jetty.ee8.servlet.ServletContextHandler;
 import org.eclipse.jetty.ee8.servlet.ServletHolder;
 import org.eclipse.jetty.server.Server;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 // CHECKSTYLE.ON: IllegalImport
 
 /**
  * A <i>Prometheus</i> based {@link StatsProvider} implementation.
  */
+@CustomLog
 public class PrometheusMetricsProvider implements StatsProvider {
 
     private ScheduledExecutorService executor;
@@ -117,7 +117,7 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
 
             try {
                 server.start();
-                log.info("Started Prometheus stats endpoint at {}", 
httpEndpoint);
+                log.info().attr("endpoint", httpEndpoint).log("Started 
Prometheus stats endpoint");
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }
@@ -163,7 +163,7 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
             try {
                 server.stop();
             } catch (Exception e) {
-                log.warn("Failed to shutdown Jetty server", e);
+                log.warn().exception(e).log("Failed to shutdown Jetty server");
             } finally {
                 ThreadRegistry.clear();
             }
@@ -211,14 +211,10 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
             collector.register(registry);
         } catch (Exception e) {
             // Ignore if these were already registered
-            if (log.isDebugEnabled()) {
-                log.debug("Failed to register Prometheus collector exports", 
e);
-            }
+            log.debug().exception(e).log("Failed to register Prometheus 
collector exports");
         }
     }
 
-    private static final Logger log = 
LoggerFactory.getLogger(PrometheusMetricsProvider.class);
-
     /*
      * Try to get Netty counter of used direct memory. This will be correct, 
unlike the JVM values.
      */
@@ -235,7 +231,7 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
                 field.setAccessible(true);
                 tmpDirectMemoryUsage = (AtomicLong) field.get(null);
             } catch (Throwable t) {
-                log.warn("Failed to access netty DIRECT_MEMORY_COUNTER field 
{}", t.getMessage());
+                log.warn().exceptionMessage(t).log("Failed to access netty 
DIRECT_MEMORY_COUNTER field");
             }
             directMemoryUsage = tmpDirectMemoryUsage;
             getDirectMemoryUsage = () -> directMemoryUsage != null ? 
directMemoryUsage.get() : Double.NaN;
diff --git 
a/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/ThreadScopedDataSketchesStatsLogger.java
 
b/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/ThreadScopedDataSketchesStatsLogger.java
index cee895b0c5..33efe9e4eb 100644
--- 
a/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/ThreadScopedDataSketchesStatsLogger.java
+++ 
b/stats/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/ThreadScopedDataSketchesStatsLogger.java
@@ -19,20 +19,18 @@ package org.apache.bookkeeper.stats.prometheus;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import lombok.CustomLog;
 import org.apache.bookkeeper.stats.OpStatsData;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.ThreadRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * OpStatsLogger implementation that lazily registers OpStatsLoggers per thread
  * with added labels for the threadpool/thresd name and thread no.
  */
+@CustomLog
 public class ThreadScopedDataSketchesStatsLogger implements OpStatsLogger {
 
-    private static Logger logger = 
LoggerFactory.getLogger(ThreadScopedDataSketchesStatsLogger.class);
-
     private ThreadLocal<DataSketchesOpStatsLogger> statsLoggers;
     private DataSketchesOpStatsLogger defaultStatsLogger;
     private Map<String, String> originalLabels;
@@ -99,16 +97,19 @@ public class ThreadScopedDataSketchesStatsLogger implements 
OpStatsLogger {
         if (!statsLogger.isThreadInitialized()) {
             ThreadRegistry.ThreadPoolThread tpt = ThreadRegistry.get();
             if (tpt == null) {
-                logger.warn("Thread {} was not registered in the thread 
registry. Using default stats logger {}.",
-                        Thread.currentThread(), defaultStatsLogger);
+                log.warn()
+                        .attr("thread", Thread.currentThread())
+                        .attr("statsLogger", defaultStatsLogger)
+                        .log("Thread was not registered in the thread 
registry. Using default stats logger");
                 statsLoggers.set(defaultStatsLogger);
                 DataSketchesOpStatsLogger previous = provider.opStats
                         .put(new ScopeContext(scopeContext.getScope(), 
originalLabels), defaultStatsLogger);
                 // If we overwrite a logger, metrics will not be collected 
correctly
                 if (previous != null && previous != defaultStatsLogger) {
-                    logger.error("Invalid state for thead " + 
Thread.currentThread() + ". Overwrote a stats logger."
-                                    + "New is {}, previous was {}",
-                            defaultStatsLogger, previous);
+                    log.error()
+                            .attr("thread", Thread.currentThread())
+                            .attr("newLogger", defaultStatsLogger)
+                            .attr("previousLogger", previous).log("Invalid 
state. Overwrote a stats logger");
                     throw new IllegalStateException("Invalid state. Overwrote 
a stats logger.");
                 }
                 return defaultStatsLogger;
@@ -122,9 +123,10 @@ public class ThreadScopedDataSketchesStatsLogger 
implements OpStatsLogger {
                         .put(new ScopeContext(scopeContext.getScope(), 
threadScopedlabels), statsLogger);
                 // If we overwrite a logger, metrics will not be collected 
correctly
                 if (previous != null && previous != statsLogger) {
-                    logger.error("Invalid state for thead " + 
Thread.currentThread() + ". Overwrote a stats logger."
-                                    + "New is {}, previous was {}",
-                            defaultStatsLogger, previous);
+                    log.error()
+                            .attr("thread", Thread.currentThread())
+                            .attr("newLogger", defaultStatsLogger)
+                            .attr("previousLogger", previous).log("Invalid 
state. Overwrote a stats logger");
                     throw new IllegalStateException("Invalid state. Overwrote 
a stats logger.");
                 }
             }
diff --git 
a/stats/utils/src/main/java/org/apache/bookkeeper/stats/utils/StatsDocGenerator.java
 
b/stats/utils/src/main/java/org/apache/bookkeeper/stats/utils/StatsDocGenerator.java
index f3774f7179..1231cb8d30 100644
--- 
a/stats/utils/src/main/java/org/apache/bookkeeper/stats/utils/StatsDocGenerator.java
+++ 
b/stats/utils/src/main/java/org/apache/bookkeeper/stats/utils/StatsDocGenerator.java
@@ -41,8 +41,8 @@ import java.util.Set;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 import lombok.AllArgsConstructor;
+import lombok.CustomLog;
 import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.Gauge;
 import org.apache.bookkeeper.stats.OpStatsLogger;
@@ -60,7 +60,7 @@ import org.yaml.snakeyaml.Yaml;
 /**
  * Generator stats documentation.
  */
-@Slf4j
+@CustomLog
 public class StatsDocGenerator {
 
     enum StatsType {
@@ -118,18 +118,18 @@ public class StatsDocGenerator {
     }
 
     public void generate(String filename) throws Exception {
-        log.info("Processing classes under package {}", packagePrefix);
+        log.info().attr("packagePrefix", packagePrefix).log("Processing 
classes under package");
         // get all classes annotated with `StatsDoc`
         Set<Class<?>> annotatedClasses = 
reflections.getTypesAnnotatedWith(StatsDoc.class);
-        log.info("Retrieve all `StatsDoc` annotated classes : {}", 
annotatedClasses);
+        log.info().attr("annotatedClasses", annotatedClasses).log("Retrieve 
all `StatsDoc` annotated classes");
 
         for (Class<?> annotatedClass : annotatedClasses) {
             generateDocForAnnotatedClass(annotatedClass);
         }
-        log.info("Successfully processed classes under package {}", 
packagePrefix);
-        log.info("Writing stats doc to file {}", filename);
+        log.info().attr("packagePrefix", packagePrefix).log("Successfully 
processed classes under package");
+        log.info().attr("filename", filename).log("Writing stats doc to file");
         writeDoc(filename);
-        log.info("Successfully wrote stats doc to file {}", filename);
+        log.info().attr("filename", filename).log("Successfully wrote stats 
doc to file");
     }
 
     private void generateDocForAnnotatedClass(Class<?> annotatedClass) {
@@ -138,7 +138,10 @@ public class StatsDocGenerator {
             return;
         }
 
-        log.info("Processing StatsDoc annotated class {} : {}", 
annotatedClass, scopeStatsDoc);
+        log.info()
+                .attr("annotatedClass", annotatedClass)
+                .attr("scopeStatsDoc", scopeStatsDoc)
+                .log("Processing StatsDoc annotated class");
 
         Field[] fields = annotatedClass.getDeclaredFields();
         for (Field field : fields) {
@@ -150,7 +153,7 @@ public class StatsDocGenerator {
             generateDocForAnnotatedField(scopeStatsDoc, fieldStatsDoc, field);
         }
 
-        log.info("Successfully processed StatsDoc annotated class {}.", 
annotatedClass);
+        log.info().attr("annotatedClass", annotatedClass).log("Successfully 
processed StatsDoc annotated class");
     }
 
     private NavigableMap<String, StatsDocEntry> getCategoryMap(String 
category) {
diff --git 
a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKAsyncLogReader.java
 
b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKAsyncLogReader.java
index 2e9327be42..2ecd4fc523 100644
--- 
a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKAsyncLogReader.java
+++ 
b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKAsyncLogReader.java
@@ -651,7 +651,7 @@ class BKAsyncLogReader implements AsyncLogReader, Runnable, 
AsyncNotification {
 
                             // gap detection
                             if (recordPositionsContainsGap(record, 
lastPosition)) {
-                                bkDistributedLogManager.raiseAlert("Gap 
detected between records at record = {}",
+                                bkDistributedLogManager.raiseAlert("Gap 
detected between records at record = %s",
                                         record);
                                 if (positionGapDetectionEnabled) {
                                     throw new DLIllegalStateException("Gap 
detected between records at record = "
@@ -703,7 +703,7 @@ class BKAsyncLogReader implements AsyncLogReader, Runnable, 
AsyncNotification {
                         }
                         // We should never get here as we should have exited 
the loop if
                         // pendingRequests were empty
-                        bkDistributedLogManager.raiseAlert("Unexpected 
condition at dlsn = {}",
+                        bkDistributedLogManager.raiseAlert("Unexpected 
condition at dlsn = %s",
                                 nextRequest.records.get(0).getDlsn());
                         setLastException(ise);
                     }
diff --git 
a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKLogSegmentWriter.java
 
b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKLogSegmentWriter.java
index 7ac75b9927..4b0ca619e3 100644
--- 
a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKLogSegmentWriter.java
+++ 
b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/BKLogSegmentWriter.java
@@ -1120,7 +1120,7 @@ class BKLogSegmentWriter implements LogSegmentWriter, 
AddCallback, Runnable, Siz
                 
FailpointUtils.checkFailPoint(FailpointUtils.FailPointName.FP_TransmitFailGetBuffer);
             } catch (IOException e) {
                 if (e instanceof InvalidEnvelopedEntryException) {
-                    alertStatsLogger.raise("Invalid enveloped entry for 
segment {} : ", fullyQualifiedLogSegment, e);
+                    alertStatsLogger.raise("Invalid enveloped entry for 
segment %s : %s", fullyQualifiedLogSegment, e);
                 }
                 LOG.error("Exception while enveloping entries for segment: {}",
                           new Object[] {fullyQualifiedLogSegment}, e);
@@ -1128,7 +1128,7 @@ class BKLogSegmentWriter implements LogSegmentWriter, 
AddCallback, Runnable, Siz
                 // no future writes go through and violate ordering guarantees.
                 transmitResultUpdater.set(this, 
BKException.Code.WriteException);
                 if (e instanceof InvalidEnvelopedEntryException) {
-                    alertStatsLogger.raise("Invalid enveloped entry for 
segment {} : ", fullyQualifiedLogSegment, e);
+                    alertStatsLogger.raise("Invalid enveloped entry for 
segment %s : %s", fullyQualifiedLogSegment, e);
                     throw (InvalidEnvelopedEntryException) e;
                 } else {
                     throw new WriteException(streamName, "Envelope Error");
diff --git 
a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/ReadAheadEntryReader.java
 
b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/ReadAheadEntryReader.java
index 5ed3f3c4d9..e045255506 100644
--- 
a/stream/distributedlog/core/src/main/java/org/apache/distributedlog/ReadAheadEntryReader.java
+++ 
b/stream/distributedlog/core/src/main/java/org/apache/distributedlog/ReadAheadEntryReader.java
@@ -889,7 +889,7 @@ class ReadAheadEntryReader implements
         if (segment.isPartiallyTruncated()
                 && segment.getMinActiveDLSN().compareTo(fromDLSN) > 0) {
             if (conf.getAlertWhenPositioningOnTruncated()) {
-                alertStatsLogger.raise("Trying to position reader on {} when 
{} is marked partially truncated",
+                alertStatsLogger.raise("Trying to position reader on %s when 
%s is marked partially truncated",
                     fromDLSN, segment);
             }
             if (!conf.getIgnoreTruncationStatus()) {

Reply via email to