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 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 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()) {