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 3bc06f8e7ea..97880cfaba3 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.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 @@ private void consumeOOMError(OutOfMemoryError outOfMemoryError) { 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/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt index e23b4fe4b09..f66fb0c91a7 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-all.bin.txt @@ -216,6 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] +- lib/io.github.merlimat.slog-slog-0.9.8.jar [64] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-compression-4.2.12.Final.jar [11] @@ -422,6 +423,7 @@ Apache Software License, Version 2. [61] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [62] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [63] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java +[64] Source available at https://github.com/merlimat/slog/tree/v0.9.8 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt index 6982f75955d..8b39fb9a5dd 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-bkctl.bin.txt @@ -216,6 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] +- lib/io.github.merlimat.slog-slog-0.9.8.jar [59] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-common-4.2.12.Final.jar [11] @@ -355,6 +356,7 @@ Apache Software License, Version 2. [56] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [57] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [58] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java +[59] Source available at https://github.com/merlimat/slog/tree/v0.9.8 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt index b4b7a8f44e0..362493a0515 100644 --- a/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt +++ b/bookkeeper-dist/src/main/resources/LICENSE-server.bin.txt @@ -216,6 +216,7 @@ Apache Software License, Version 2. - lib/commons-codec-commons-codec-1.18.0.jar [6] - lib/commons-io-commons-io-2.19.0.jar [8] - lib/commons-logging-commons-logging-1.3.5.jar [10] +- lib/io.github.merlimat.slog-slog-0.9.8.jar [63] - lib/io.netty-netty-buffer-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-base-4.2.12.Final.jar [11] - lib/io.netty-netty-codec-compression-4.2.12.Final.jar [11] @@ -417,6 +418,7 @@ Apache Software License, Version 2. [60] Source available at https://github.com/apache/commons-text/tree/rel/commons-text-1.13.1 [61] Source available at https://github.com/apache/commons-beanutils/tree/rel/commons-beanutils-1.11.0 [62] Source available at https://github.com/googleapis/sdk-platform-java/tree/v2.53.0/api-common-java +[63] Source available at https://github.com/merlimat/slog/tree/v0.9.8 ------------------------------------------------------------------------------------ lib/io.netty-netty-codec-base-4.2.12.Final.jar bundles some 3rd party dependencies diff --git a/lombok.config b/lombok.config new file mode 100644 index 00000000000..bc68b26eebd --- /dev/null +++ b/lombok.config @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# this is the top level Lombok configuration file +# see https://projectlombok.org/features/configuration for reference + +config.stopBubbling = true +lombok.log.custom.declaration = io.github.merlimat.slog.Logger io.github.merlimat.slog.Logger.get(TYPE) diff --git a/pom.xml b/pom.xml index 29d3d24be86..d18f145ed76 100644 --- a/pom.xml +++ b/pom.xml @@ -192,6 +192,7 @@ 9.9.3 3.3.0 2.0.12 + 0.9.8 2.0 4.6.0 2.43.0 @@ -273,6 +274,11 @@ + + io.github.merlimat.slog + slog + ${slog.version} + org.slf4j slf4j-bom @@ -882,6 +888,10 @@ + + io.github.merlimat.slog + slog + org.slf4j slf4j-api 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 9b79449ec45..06f51647a78 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 void raise(String msg, Object... args) { 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 390925a32bc..8f6c9eda616 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 @@ 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 static void loadStatsProvider(String className) { (Constructor) 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 5bc7259a09f..ca6fa0dc97d 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 @@ 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 @@ * 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 threadPoolMap = new ConcurrentHashMap<>(); private static ConcurrentMap threadPoolThreadMap = new ConcurrentHashMap<>(); @@ -59,7 +58,10 @@ public static void register(String threadPool, boolean force) { 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 65e8c230f59..ad46a021cb1 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.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 Codahale metrics library. */ @SuppressWarnings("deprecation") +@CustomLog public class CodahaleMetricsProvider implements StatsProvider { - static final Logger LOG = LoggerFactory.getLogger(CodahaleMetricsProvider.class); - MetricRegistry metrics = null; List reporters = new ArrayList(); JmxReporter jmx = null; @@ -76,7 +75,7 @@ public void start(Configuration conf) { 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 void start(Configuration conf) { } 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 void start(Configuration conf) { .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 817db0aa78e..f812151d6d7 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.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 StatsLogger getStatsLogger(String scope) { 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 8fa56ce5ffd..c1537d65d08 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.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.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 Prometheus based {@link StatsProvider} implementation. */ +@CustomLog public class PrometheusMetricsProvider implements StatsProvider { private ScheduledExecutorService executor; @@ -117,7 +117,7 @@ public void start(Configuration conf) { 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 void stop() { 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 @@ private void registerMetrics(Collector collector) { 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 @@ private void registerMetrics(Collector collector) { 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 cee895b0c54..33efe9e4eb9 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 @@ 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 statsLoggers; private DataSketchesOpStatsLogger defaultStatsLogger; private Map originalLabels; @@ -99,16 +97,19 @@ private DataSketchesOpStatsLogger getStatsLogger() { 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 @@ private DataSketchesOpStatsLogger getStatsLogger() { .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 f3774f7179f..1231cb8d30a 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.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 @@ /** * Generator stats documentation. */ -@Slf4j +@CustomLog public class StatsDocGenerator { enum StatsType { @@ -118,18 +118,18 @@ public StatsDocGenerator(String packagePrefix, } 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> 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 @@ private void generateDocForAnnotatedClass(Class annotatedClass) { 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 @@ private void generateDocForAnnotatedClass(Class annotatedClass) { 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 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 2e9327be420..2ecd4fc5232 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 @@ record = readNextRecord(); // 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 @@ record = readNextRecord(); } // 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 7ac75b99279..4b0ca619e3b 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 @@ private CompletableFuture transmit() 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 @@ private CompletableFuture transmit() // 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 5ed3f3c4d90..e0452555060 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 @@ private boolean isAllowedToPosition(LogSegmentMetadata segment, DLSN fromDLSN) { 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()) {