* The approach we take is to mimic the public interface of {@link java.util.logging.Logger} and use the maven shadow plugin to replace the
* usage of {@link java.util.logging.Logger} in our dependencies with this class.
- * This class then forwards the logger calls to a slf4j {@link org.slf4j.Logger}.
+ * This class then forwards the logger calls to a {@link co.elastic.apm.agent.sdk.logging.Logger}.
*
*/
public class JulBridgeLogger {
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/Log4j2LoggerBridge.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/Log4j2LoggerBridge.java
new file mode 100644
index 0000000000..7b5e5f8418
--- /dev/null
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/Log4j2LoggerBridge.java
@@ -0,0 +1,194 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.apm.agent.logging;
+
+import co.elastic.apm.agent.sdk.logging.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.spi.ExtendedLogger;
+
+/**
+ * Based on {@code org.apache.logging.slf4j.Log4jLogger}
+ */
+public class Log4j2LoggerBridge implements Logger {
+
+ public static final String FQCN = Log4j2LoggerBridge.class.getName();
+
+ private final ExtendedLogger log4jLogger;
+ private final String name;
+
+ public Log4j2LoggerBridge(ExtendedLogger log4jLogger, String name) {
+ this.log4jLogger = log4jLogger;
+ this.name = name;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean isTraceEnabled() {
+ return log4jLogger.isEnabled(Level.TRACE, null, null);
+ }
+
+ @Override
+ public void trace(final String format) {
+ log4jLogger.logIfEnabled(FQCN, Level.TRACE, null, format);
+ }
+
+ @Override
+ public void trace(final String format, final Object o) {
+ log4jLogger.logIfEnabled(FQCN, Level.TRACE, null, format, o);
+ }
+
+ @Override
+ public void trace(final String format, final Object arg1, final Object arg2) {
+ log4jLogger.logIfEnabled(FQCN, Level.TRACE, null, format, arg1, arg2);
+ }
+
+ @Override
+ public void trace(final String format, final Object... args) {
+ log4jLogger.logIfEnabled(FQCN, Level.TRACE, null, format, args);
+ }
+
+ @Override
+ public void trace(final String format, final Throwable t) {
+ log4jLogger.logIfEnabled(FQCN, Level.TRACE, null, format, t);
+ }
+
+ @Override
+ public boolean isDebugEnabled() {
+ return log4jLogger.isEnabled(Level.DEBUG, null, null);
+ }
+
+ @Override
+ public void debug(final String format) {
+ log4jLogger.logIfEnabled(FQCN, Level.DEBUG, null, format);
+ }
+
+ @Override
+ public void debug(final String format, final Object o) {
+ log4jLogger.logIfEnabled(FQCN, Level.DEBUG, null, format, o);
+ }
+
+ @Override
+ public void debug(final String format, final Object arg1, final Object arg2) {
+ log4jLogger.logIfEnabled(FQCN, Level.DEBUG, null, format, arg1, arg2);
+ }
+
+ @Override
+ public void debug(final String format, final Object... args) {
+ log4jLogger.logIfEnabled(FQCN, Level.DEBUG, null, format, args);
+ }
+
+ @Override
+ public void debug(final String format, final Throwable t) {
+ log4jLogger.logIfEnabled(FQCN, Level.DEBUG, null, format, t);
+ }
+
+ @Override
+ public boolean isInfoEnabled() {
+ return log4jLogger.isEnabled(Level.INFO, null, null);
+ }
+
+ @Override
+ public void info(final String format) {
+ log4jLogger.logIfEnabled(FQCN, Level.INFO, null, format);
+ }
+
+ @Override
+ public void info(final String format, final Object o) {
+ log4jLogger.logIfEnabled(FQCN, Level.INFO, null, format, o);
+ }
+
+ @Override
+ public void info(final String format, final Object arg1, final Object arg2) {
+ log4jLogger.logIfEnabled(FQCN, Level.INFO, null, format, arg1, arg2);
+ }
+
+ @Override
+ public void info(final String format, final Object... args) {
+ log4jLogger.logIfEnabled(FQCN, Level.INFO, null, format, args);
+ }
+
+ @Override
+ public void info(final String format, final Throwable t) {
+ log4jLogger.logIfEnabled(FQCN, Level.INFO, null, format, t);
+ }
+
+ @Override
+ public boolean isWarnEnabled() {
+ return log4jLogger.isEnabled(Level.WARN, null, null);
+ }
+
+ @Override
+ public void warn(final String format) {
+ log4jLogger.logIfEnabled(FQCN, Level.WARN, null, format);
+ }
+
+ @Override
+ public void warn(final String format, final Object o) {
+ log4jLogger.logIfEnabled(FQCN, Level.WARN, null, format, o);
+ }
+
+ @Override
+ public void warn(final String format, final Object arg1, final Object arg2) {
+ log4jLogger.logIfEnabled(FQCN, Level.WARN, null, format, arg1, arg2);
+ }
+
+ @Override
+ public void warn(final String format, final Object... args) {
+ log4jLogger.logIfEnabled(FQCN, Level.WARN, null, format, args);
+ }
+
+ @Override
+ public void warn(final String format, final Throwable t) {
+ log4jLogger.logIfEnabled(FQCN, Level.WARN, null, format, t);
+ }
+
+ @Override
+ public boolean isErrorEnabled() {
+ return log4jLogger.isEnabled(Level.ERROR, null, null);
+ }
+
+ @Override
+ public void error(final String format) {
+ log4jLogger.logIfEnabled(FQCN, Level.ERROR, null, format);
+ }
+
+ @Override
+ public void error(final String format, final Object o) {
+ log4jLogger.logIfEnabled(FQCN, Level.ERROR, null, format, o);
+ }
+
+ @Override
+ public void error(final String format, final Object arg1, final Object arg2) {
+ log4jLogger.logIfEnabled(FQCN, Level.ERROR, null, format, arg1, arg2);
+ }
+
+ @Override
+ public void error(final String format, final Object... args) {
+ log4jLogger.logIfEnabled(FQCN, Level.ERROR, null, format, args);
+ }
+
+ @Override
+ public void error(final String format, final Throwable t) {
+ log4jLogger.logIfEnabled(FQCN, Level.ERROR, null, format, t);
+ }
+}
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/Log4jLoggerFactoryBridge.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/Log4jLoggerFactoryBridge.java
new file mode 100644
index 0000000000..41165e9d9c
--- /dev/null
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/Log4jLoggerFactoryBridge.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.apm.agent.logging;
+
+import co.elastic.apm.agent.sdk.logging.ILoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
+import org.apache.logging.log4j.spi.LoggerContext;
+import org.apache.logging.log4j.util.StackLocatorUtil;
+
+/**
+ * Based on {@code org.apache.logging.slf4j.Log4jLoggerFactory}
+ */
+public class Log4jLoggerFactoryBridge extends AbstractLoggerAdapter implements ILoggerFactory {
+
+ private static final String FQCN = Log4jLoggerFactoryBridge.class.getName();
+ private static final String PACKAGE = "co.elastic.apm.agent.sdk.logging";
+
+ @Override
+ protected Logger newLogger(final String name, final LoggerContext context) {
+ final String key = Logger.ROOT_LOGGER_NAME.equals(name) ? LogManager.ROOT_LOGGER_NAME : name;
+ return new Log4j2LoggerBridge(context.getLogger(key), name);
+ }
+
+ @Override
+ protected LoggerContext getContext() {
+ final Class> anchor = StackLocatorUtil.getCallerClass(FQCN, PACKAGE);
+ return anchor == null ? LogManager.getContext() : getContext(StackLocatorUtil.getCallerClass(anchor));
+ }
+}
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/LoggingConfiguration.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/LoggingConfiguration.java
index 74de52f08a..2d57e636e6 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/LoggingConfiguration.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/logging/LoggingConfiguration.java
@@ -22,6 +22,7 @@
import co.elastic.apm.agent.configuration.converter.ByteValueConverter;
import co.elastic.apm.agent.matcher.WildcardMatcher;
import co.elastic.apm.agent.matcher.WildcardMatcherValueConverter;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
@@ -32,7 +33,6 @@
import org.apache.logging.log4j.core.selector.ContextSelector;
import org.apache.logging.log4j.spi.LoggerContextFactory;
import org.apache.logging.log4j.status.StatusLogger;
-import org.slf4j.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;
import org.stagemonitor.configuration.converter.ListValueConverter;
@@ -52,7 +52,7 @@
*
* This class is a bit special compared to other {@link ConfigurationOptionProvider}s,
* because we have to make sure that wie initialize the logger before anyone calls
- * {@link org.slf4j.LoggerFactory#getLogger(Class)}.
+ * {@link LoggerFactory#getLogger(Class)}.
* That's why we don't read the values from the {@link ConfigurationOption} fields but
* iterate over the {@link ConfigurationSource}s manually to read the values
* (see {@link Log4j2ConfigurationFactory#getValue}).
@@ -324,6 +324,7 @@ public static void init(List sources, String ephemeralId) {
// example through org.apache.logging.log4j.core.config.Configurator, means that loggers in non-initialized
// contexts will either get the app-configuration for log4j, if such exists, or none.
ConfigurationFactory.setConfigurationFactory(new Log4j2ConfigurationFactory(sources, ephemeralId));
+ LoggerFactory.initialize(new Log4jLoggerFactoryBridge());
} catch (Throwable throwable) {
System.err.println("[elastic-apm-agent] ERROR Failure during initialization of agent's log4j system: " + throwable.getMessage());
} finally {
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/MetricRegistry.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/MetricRegistry.java
index 329bb04bc0..710de09f8b 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/MetricRegistry.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/MetricRegistry.java
@@ -21,8 +21,8 @@
import co.elastic.apm.agent.matcher.WildcardMatcher;
import co.elastic.apm.agent.report.ReporterConfiguration;
import org.HdrHistogram.WriterReaderPhaser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/CGroupMetrics.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/CGroupMetrics.java
index a2242740a1..5f0c0fb275 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/CGroupMetrics.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/CGroupMetrics.java
@@ -23,8 +23,8 @@
import co.elastic.apm.agent.metrics.DoubleSupplier;
import co.elastic.apm.agent.metrics.Labels;
import co.elastic.apm.agent.metrics.MetricRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.util.StringUtils;
import javax.annotation.Nullable;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/JvmMemoryMetrics.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/JvmMemoryMetrics.java
index 9d42b7aabb..114b6e32ab 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/JvmMemoryMetrics.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/metrics/builtin/JvmMemoryMetrics.java
@@ -23,8 +23,8 @@
import co.elastic.apm.agent.metrics.DoubleSupplier;
import co.elastic.apm.agent.metrics.Labels;
import co.elastic.apm.agent.metrics.MetricRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/AbstractIntakeApiHandler.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/AbstractIntakeApiHandler.java
index f6398149ef..49a6b2070a 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/AbstractIntakeApiHandler.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/AbstractIntakeApiHandler.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.report.serialize.DslJsonSerializer;
import co.elastic.apm.agent.report.serialize.PayloadSerializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.util.IOUtils;
import javax.annotation.Nullable;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerClient.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerClient.java
index 52658a2887..2679d269d1 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerClient.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerClient.java
@@ -23,8 +23,8 @@
import co.elastic.apm.agent.util.UrlConnectionUtils;
import co.elastic.apm.agent.util.Version;
import co.elastic.apm.agent.util.VersionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationOption;
import javax.annotation.Nonnull;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerHealthChecker.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerHealthChecker.java
index 79171f77a4..bc86ba96dd 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerHealthChecker.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerHealthChecker.java
@@ -24,8 +24,8 @@
import com.dslplatform.json.JsonReader;
import com.dslplatform.json.Nullable;
import com.dslplatform.json.ObjectConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.net.HttpURLConnection;
import java.util.Collections;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerReporter.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerReporter.java
index 655152a99e..f5a1e6b647 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerReporter.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ApmServerReporter.java
@@ -32,8 +32,8 @@
import com.lmax.disruptor.InsufficientCapacityException;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.concurrent.ThreadFactory;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/IntakeV2ReportingEventHandler.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/IntakeV2ReportingEventHandler.java
index 20da346401..916d4d00a8 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/IntakeV2ReportingEventHandler.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/IntakeV2ReportingEventHandler.java
@@ -21,8 +21,8 @@
import co.elastic.apm.agent.report.processor.ProcessorEventHandler;
import co.elastic.apm.agent.report.serialize.PayloadSerializer;
import co.elastic.apm.agent.util.ExecutorUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.net.HttpURLConnection;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ReporterConfiguration.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ReporterConfiguration.java
index 77ddbaf7b7..b9425f8a26 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ReporterConfiguration.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ReporterConfiguration.java
@@ -24,7 +24,7 @@
import co.elastic.apm.agent.configuration.converter.TimeDurationValueConverter;
import co.elastic.apm.agent.matcher.WildcardMatcher;
import co.elastic.apm.agent.matcher.WildcardMatcherValueConverter;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;
import org.stagemonitor.configuration.converter.ListValueConverter;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java
index 0f8351f6a0..deea291f50 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java
@@ -64,8 +64,8 @@
import com.dslplatform.json.JsonWriter;
import com.dslplatform.json.NumberConverter;
import com.dslplatform.json.StringConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.ByteArrayOutputStream;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/SslUtils.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/SslUtils.java
index b669d9bed7..26444282c5 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/SslUtils.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/SslUtils.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.report.ssl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import javax.net.ssl.HostnameVerifier;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/TLSFallbackSSLSocket.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/TLSFallbackSSLSocket.java
index 8f0357f3c5..9dd8ac9366 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/TLSFallbackSSLSocket.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/ssl/TLSFallbackSSLSocket.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.report.ssl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.net.ssl.HandshakeCompletedListener;
import javax.net.ssl.SSLHandshakeException;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/BinaryHeaderMap.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/BinaryHeaderMap.java
index 8d155760f5..129726f235 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/BinaryHeaderMap.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/BinaryHeaderMap.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.objectpool.Recyclable;
import co.elastic.apm.agent.report.serialize.DslJsonSerializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.nio.Buffer;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/DependencyInjectingServiceLoader.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/DependencyInjectingServiceLoader.java
index 33c1f6011e..4da3af2a5c 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/DependencyInjectingServiceLoader.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/DependencyInjectingServiceLoader.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.util;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.BufferedReader;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/ExecutorUtils.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/ExecutorUtils.java
index 326aa11c53..790bd55a34 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/ExecutorUtils.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/ExecutorUtils.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.util;
import co.elastic.apm.agent.common.ThreadUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.concurrent.CancellationException;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/JmxUtils.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/JmxUtils.java
index 4bd93ea4fd..54d46ec4f7 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/JmxUtils.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/JmxUtils.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.util;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.management.OperatingSystemMXBean;
diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/LoggerUtils.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/LoggerUtils.java
index b84f4d0cff..8aed0f0e96 100644
--- a/apm-agent-core/src/main/java/co/elastic/apm/agent/util/LoggerUtils.java
+++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/util/LoggerUtils.java
@@ -18,8 +18,7 @@
*/
package co.elastic.apm.agent.util;
-import org.slf4j.Logger;
-import org.slf4j.Marker;
+import co.elastic.apm.agent.sdk.logging.Logger;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -89,46 +88,6 @@ public void trace(String msg, Throwable t) {
}
}
- @Override
- public boolean isTraceEnabled(Marker marker) {
- return isEnabled(delegate.isTraceEnabled(marker));
- }
-
- @Override
- public void trace(Marker marker, String msg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.trace(marker, msg);
- }
- }
-
- @Override
- public void trace(Marker marker, String format, Object arg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.trace(marker, format, arg);
- }
- }
-
- @Override
- public void trace(Marker marker, String format, Object arg1, Object arg2) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.trace(marker, format, arg1, arg2);
- }
- }
-
- @Override
- public void trace(Marker marker, String format, Object... argArray) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.trace(marker, format, argArray);
- }
- }
-
- @Override
- public void trace(Marker marker, String msg, Throwable t) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.trace(marker, msg, t);
- }
- }
-
@Override
public boolean isDebugEnabled() {
return isEnabled(delegate.isDebugEnabled());
@@ -169,46 +128,6 @@ public void debug(String msg, Throwable t) {
}
}
- @Override
- public boolean isDebugEnabled(Marker marker) {
- return isEnabled(delegate.isDebugEnabled(marker));
- }
-
- @Override
- public void debug(Marker marker, String msg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.debug(marker, msg);
- }
- }
-
- @Override
- public void debug(Marker marker, String format, Object arg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.debug(marker, format, arg);
- }
- }
-
- @Override
- public void debug(Marker marker, String format, Object arg1, Object arg2) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.debug(marker, format, arg1, arg2);
- }
- }
-
- @Override
- public void debug(Marker marker, String format, Object... arguments) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.debug(marker, format, arguments);
- }
- }
-
- @Override
- public void debug(Marker marker, String msg, Throwable t) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.debug(marker, msg, t);
- }
- }
-
@Override
public boolean isInfoEnabled() {
return isEnabled(delegate.isInfoEnabled());
@@ -249,46 +168,6 @@ public void info(String msg, Throwable t) {
}
}
- @Override
- public boolean isInfoEnabled(Marker marker) {
- return isEnabled(delegate.isInfoEnabled(marker));
- }
-
- @Override
- public void info(Marker marker, String msg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.info(marker, msg);
- }
- }
-
- @Override
- public void info(Marker marker, String format, Object arg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.info(marker, format, arg);
- }
- }
-
- @Override
- public void info(Marker marker, String format, Object arg1, Object arg2) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.info(marker, format, arg1, arg2);
- }
- }
-
- @Override
- public void info(Marker marker, String format, Object... arguments) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.info(marker, format, arguments);
- }
- }
-
- @Override
- public void info(Marker marker, String msg, Throwable t) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.info(marker, msg, t);
- }
- }
-
@Override
public boolean isWarnEnabled() {
return isEnabled(delegate.isWarnEnabled());
@@ -329,46 +208,6 @@ public void warn(String msg, Throwable t) {
}
}
- @Override
- public boolean isWarnEnabled(Marker marker) {
- return isEnabled(delegate.isWarnEnabled(marker));
- }
-
- @Override
- public void warn(Marker marker, String msg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.warn(marker, msg);
- }
- }
-
- @Override
- public void warn(Marker marker, String format, Object arg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.warn(marker, format, arg);
- }
- }
-
- @Override
- public void warn(Marker marker, String format, Object arg1, Object arg2) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.warn(marker, format, arg1, arg2);
- }
- }
-
- @Override
- public void warn(Marker marker, String format, Object... arguments) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.warn(marker, format, arguments);
- }
- }
-
- @Override
- public void warn(Marker marker, String msg, Throwable t) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.warn(marker, msg, t);
- }
- }
-
@Override
public boolean isErrorEnabled() {
return isEnabled(delegate.isErrorEnabled());
@@ -408,45 +247,5 @@ public void error(String msg, Throwable t) {
delegate.error(msg, t);
}
}
-
- @Override
- public boolean isErrorEnabled(Marker marker) {
- return isEnabled(delegate.isErrorEnabled(marker));
- }
-
- @Override
- public void error(Marker marker, String msg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.error(marker, msg);
- }
- }
-
- @Override
- public void error(Marker marker, String format, Object arg) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.error(marker, format, arg);
- }
- }
-
- @Override
- public void error(Marker marker, String format, Object arg1, Object arg2) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.error(marker, format, arg1, arg2);
- }
- }
-
- @Override
- public void error(Marker marker, String format, Object... arguments) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.error(marker, format, arguments);
- }
- }
-
- @Override
- public void error(Marker marker, String msg, Throwable t) {
- if (alreadyLogged.compareAndSet(false, true)) {
- delegate.error(marker, msg, t);
- }
- }
}
}
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/TestClassWithDependencyRunner.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/TestClassWithDependencyRunner.java
index ecb57adc3f..a73f488c43 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/TestClassWithDependencyRunner.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/TestClassWithDependencyRunner.java
@@ -18,6 +18,7 @@
*/
package co.elastic.apm.agent;
+import co.elastic.test.ChildFirstURLClassLoader;
import org.apache.ivy.Ivy;
import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
@@ -44,7 +45,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
@@ -175,61 +175,4 @@ private static List resolveArtifacts(List dependencies) throws Exce
assertThat(resolvedDependencies).hasSizeGreaterThanOrEqualTo(dependencies.size());
return resolvedDependencies;
}
-
- private static class ChildFirstURLClassLoader extends URLClassLoader {
-
- private final List urls;
-
- public ChildFirstURLClassLoader(List urls) {
- super(urls.toArray(new URL[]{}));
- this.urls = urls;
- }
-
- @Override
- public String getName() {
- return "Test class class loader: " + urls;
- }
-
- @Override
- protected Class> loadClass(String name, boolean resolve) throws ClassNotFoundException {
- synchronized (getClassLoadingLock(name)) {
- try {
- // First, check if the class has already been loaded
- Class> c = findLoadedClass(name);
- if (c == null) {
- c = findClass(name);
- if (resolve) {
- resolveClass(c);
- }
- }
- return c;
- } catch (ClassNotFoundException e) {
- return super.loadClass(name, resolve);
- }
- }
- }
-
-
- @Override
- public URL findResource(String name) {
- return super.findResource(name);
- }
-
- @Override
- public Enumeration getResources(String name) throws IOException {
- Enumeration resources = super.getResources(name);
- List resourcesList = new ArrayList<>();
- while (resources.hasMoreElements()) {
- resourcesList.add(resources.nextElement());
- }
- Collections.reverse(resourcesList);
- return Collections.enumeration(resourcesList);
- }
-
- @Override
- public String toString() {
- return getName();
- }
-
- }
}
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/ApmServerConfigurationSourceTest.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/ApmServerConfigurationSourceTest.java
index ce199e4c99..d88ac7caf5 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/ApmServerConfigurationSourceTest.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/ApmServerConfigurationSourceTest.java
@@ -33,7 +33,7 @@
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.slf4j.Logger;
+import co.elastic.apm.agent.sdk.logging.Logger;
import org.stagemonitor.configuration.ConfigurationRegistry;
import java.net.URL;
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/StartupInfoTest.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/StartupInfoTest.java
index d9b5c72071..85f05bef76 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/StartupInfoTest.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/configuration/StartupInfoTest.java
@@ -24,7 +24,7 @@
import co.elastic.apm.agent.logging.LoggingConfiguration;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
+import co.elastic.apm.agent.sdk.logging.Logger;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.configuration.ConfigurationOptionProvider;
import org.stagemonitor.configuration.ConfigurationRegistry;
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/impl/circuitbreaker/TestStressMonitor.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/impl/circuitbreaker/TestStressMonitor.java
index 0bb6a68399..a359a254a1 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/impl/circuitbreaker/TestStressMonitor.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/impl/circuitbreaker/TestStressMonitor.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.impl.circuitbreaker;
import co.elastic.apm.agent.impl.ElasticApmTracer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
class TestStressMonitor extends StressMonitor {
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/JulBridgeLoggerTest.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/JulBridgeLoggerTest.java
index c29465c9af..f05c329e52 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/JulBridgeLoggerTest.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/JulBridgeLoggerTest.java
@@ -19,9 +19,9 @@
package co.elastic.apm.agent.logging;
import co.elastic.apm.agent.AbstractInstrumentationTest;
+import co.elastic.apm.agent.sdk.logging.Logger;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
import java.util.ResourceBundle;
import java.util.logging.LogRecord;
@@ -43,73 +43,73 @@ class JulBridgeLoggerTest extends AbstractInstrumentationTest {
private JulBridgeLogger julLogger;
private Exception e;
- private Logger slf4jLogger;
+ private Logger agentFacadeLogger;
@BeforeEach
void setUp() {
- slf4jLogger = mock(Logger.class);
- julLogger = new JulBridgeLogger(slf4jLogger);
+ agentFacadeLogger = mock(Logger.class);
+ julLogger = new JulBridgeLogger(agentFacadeLogger);
e = new Exception("This exception is used to test exception logging");
}
@Test
void testLogException() {
julLogger.log(SEVERE, "test", e);
- verify(slf4jLogger).error("test", e);
+ verify(agentFacadeLogger).error("test", e);
julLogger.log(WARNING, "test", e);
- verify(slf4jLogger).warn("test", e);
+ verify(agentFacadeLogger).warn("test", e);
julLogger.log(INFO, "test", e);
julLogger.log(CONFIG, "test", e);
- verify(slf4jLogger, times(2)).info("test", e);
+ verify(agentFacadeLogger, times(2)).info("test", e);
julLogger.log(FINE, "test", e);
julLogger.log(FINER, "test", e);
- verify(slf4jLogger, times(2)).debug("test", e);
+ verify(agentFacadeLogger, times(2)).debug("test", e);
julLogger.log(FINEST, "test", e);
- verify(slf4jLogger).trace("test", e);
+ verify(agentFacadeLogger).trace("test", e);
}
@Test
void testLog() {
julLogger.log(SEVERE, "test");
- verify(slf4jLogger).error("test");
+ verify(agentFacadeLogger).error("test");
julLogger.log(WARNING, "test");
- verify(slf4jLogger).warn("test");
+ verify(agentFacadeLogger).warn("test");
julLogger.log(INFO, "test");
julLogger.log(CONFIG, "test");
- verify(slf4jLogger, times(2)).info("test");
+ verify(agentFacadeLogger, times(2)).info("test");
julLogger.log(FINE, "test");
julLogger.log(FINER, "test");
- verify(slf4jLogger, times(2)).debug("test");
+ verify(agentFacadeLogger, times(2)).debug("test");
julLogger.log(FINEST, "test");
- verify(slf4jLogger).trace("test");
+ verify(agentFacadeLogger).trace("test");
}
@Test
void testLog2() {
julLogger.severe("test");
- verify(slf4jLogger).error("test");
+ verify(agentFacadeLogger).error("test");
julLogger.warning("test");
- verify(slf4jLogger).warn("test");
+ verify(agentFacadeLogger).warn("test");
julLogger.info("test");
julLogger.config("test");
- verify(slf4jLogger, times(2)).info("test");
+ verify(agentFacadeLogger, times(2)).info("test");
julLogger.fine("test");
julLogger.finer("test");
- verify(slf4jLogger, times(2)).debug("test");
+ verify(agentFacadeLogger, times(2)).debug("test");
julLogger.finest("test");
- verify(slf4jLogger).trace("test");
+ verify(agentFacadeLogger).trace("test");
}
// The bridge does not support parameter placeholders,
@@ -117,47 +117,47 @@ void testLog2() {
@Test
void testLogWithParameter() {
julLogger.log(SEVERE, "test {0}", new Object());
- verify(slf4jLogger).error("test {0}");
+ verify(agentFacadeLogger).error("test {0}");
julLogger.log(WARNING, "test {0}", new Object());
- verify(slf4jLogger).warn("test {0}");
+ verify(agentFacadeLogger).warn("test {0}");
julLogger.log(INFO, "test {0}", new Object());
julLogger.log(CONFIG, "test {0}", new Object());
- verify(slf4jLogger, times(2)).info("test {0}");
+ verify(agentFacadeLogger, times(2)).info("test {0}");
julLogger.log(FINE, "test {0}", new Object());
julLogger.log(FINER, "test {0}", new Object());
- verify(slf4jLogger, times(2)).debug("test {0}");
+ verify(agentFacadeLogger, times(2)).debug("test {0}");
julLogger.log(FINEST, "test {0}", new Object());
- verify(slf4jLogger).trace("test {0}");
+ verify(agentFacadeLogger).trace("test {0}");
}
@Test
void testLogWithParameters() {
julLogger.log(SEVERE, "test {0}", new Object[]{new Object()});
- verify(slf4jLogger).error("test {0}");
+ verify(agentFacadeLogger).error("test {0}");
julLogger.log(WARNING, "test {0}", new Object[]{new Object()});
- verify(slf4jLogger).warn("test {0}");
+ verify(agentFacadeLogger).warn("test {0}");
julLogger.log(INFO, "test {0}", new Object[]{new Object()});
julLogger.log(CONFIG, "test {0}", new Object[]{new Object()});
- verify(slf4jLogger, times(2)).info("test {0}");
+ verify(agentFacadeLogger, times(2)).info("test {0}");
julLogger.log(FINE, "test {0}", new Object[]{new Object()});
julLogger.log(FINER, "test {0}", new Object[]{new Object()});
- verify(slf4jLogger, times(2)).debug("test {0}");
+ verify(agentFacadeLogger, times(2)).debug("test {0}");
julLogger.log(FINEST, "test {0}", new Object[]{new Object()});
- verify(slf4jLogger).trace("test {0}");
+ verify(agentFacadeLogger).trace("test {0}");
}
@Test
void testLogRecord() {
julLogger.log(new LogRecord(INFO, "test"));
- verify(slf4jLogger).info("test");
+ verify(agentFacadeLogger).info("test");
}
@Test
@@ -166,8 +166,8 @@ void testLogp() {
julLogger.logp(INFO, null, null, "test", new Object());
julLogger.logp(INFO, null, null, "test", new Object[]{});
julLogger.logp(INFO, null, null, "test", e);
- verify(slf4jLogger, times(3)).info("test");
- verify(slf4jLogger, times(1)).info("test", e);
+ verify(agentFacadeLogger, times(3)).info("test");
+ verify(agentFacadeLogger, times(1)).info("test", e);
}
@Test
@@ -180,8 +180,8 @@ void testLogrb() {
julLogger.logrb(INFO, "", "", "", "test", e);
julLogger.logrb(INFO, "", "", (ResourceBundle) null, "test", e);
julLogger.logrb(INFO, null, "test", e);
- verify(slf4jLogger, times(5)).info("test");
- verify(slf4jLogger, times(3)).info("test", e);
+ verify(agentFacadeLogger, times(5)).info("test");
+ verify(agentFacadeLogger, times(3)).info("test", e);
}
@Test
@@ -214,6 +214,6 @@ void testNoops() {
julLogger.removeHandler(null);
julLogger.setUseParentHandlers(true);
julLogger.setParent(null);
- verifyNoMoreInteractions(slf4jLogger);
+ verifyNoMoreInteractions(agentFacadeLogger);
}
}
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/LoggingConfigurationTest.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/LoggingConfigurationTest.java
index 49d42bc74e..9b34a32524 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/LoggingConfigurationTest.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/LoggingConfigurationTest.java
@@ -24,6 +24,9 @@
import co.elastic.apm.agent.configuration.SpyConfiguration;
import co.elastic.apm.agent.impl.ElasticApmTracer;
import co.elastic.apm.agent.logging.instr.LoggerTestInstrumentation;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
+import com.fasterxml.jackson.databind.JsonNode;
import net.bytebuddy.agent.ByteBuddyAgent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
@@ -33,37 +36,57 @@
import org.apache.logging.log4j.core.selector.ContextSelector;
import org.apache.logging.log4j.spi.LoggerContextFactory;
import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationOption;
+import org.stagemonitor.configuration.ConfigurationRegistry;
import javax.annotation.Nullable;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import static co.elastic.apm.agent.logging.LoggingConfiguration.LOG_LEVEL_KEY;
import static org.assertj.core.api.Assertions.assertThat;
+@SuppressWarnings("NotNullFieldNotInitialized")
class LoggingConfigurationTest {
+ public static final String LOGGING_TEST_FILE = "target/LoggingConfigurationTest.log";
+
private static LoggerContextFactory originalLoggerContextFactory;
- private static Logger agentLogger;
+ private static TestLog4jContextFactory testLog4jContextFactory;
private static ConfigurationOption logLevelConfig;
- private static TestLog4jContextFactory testLog4jContextFactory;
+ private static Logger agentLogger;
+ private static org.slf4j.Logger configOptionLogger;
+ private static Logger pluginLogger;
+
+ @Nullable
+ private static String originalLogFile;
+ @Nullable
+ private static String originalLogFileFormat;
@BeforeAll
- static void setup() {
+ static void setup() throws NoSuchFieldException, IllegalAccessException, IOException {
ElasticApmTracer tracer = MockTracer.createRealTracer();
+
+ ConfigurationRegistry configurationRegistry = tracer.getConfigurationRegistry();
//noinspection unchecked
- logLevelConfig = (ConfigurationOption) tracer.getConfigurationRegistry().getConfigurationOptionByKey("log_level");
+ logLevelConfig = (ConfigurationOption) configurationRegistry.getConfigurationOptionByKey(LOG_LEVEL_KEY);
+ originalLogFile = System.getProperty("elastic.apm.log_file");
+ originalLogFileFormat = System.getProperty("elastic.apm.log_format_file");
+ Files.deleteIfExists(Path.of(LOGGING_TEST_FILE));
+ System.setProperty("elastic.apm.log_file", LOGGING_TEST_FILE);
+ System.setProperty("elastic.apm.log_format_file", "JSON");
ElasticApmAgent.initInstrumentation(tracer, ByteBuddyAgent.install(), List.of(new LoggerTestInstrumentation()));
// We need to clean the current contexts for this test to resemble early agent setup
@@ -76,38 +99,74 @@ static void setup() {
testLog4jContextFactory = new TestLog4jContextFactory();
LogManager.setFactory(testLog4jContextFactory);
+ // Testing that stagemonitor's slf4j loggers are setup properly and get the agent configuration
+ Field configOptionLoggerField = ConfigurationOption.class.getDeclaredField("logger");
+ configOptionLoggerField.setAccessible(true);
+ configOptionLogger = (org.slf4j.Logger) configOptionLoggerField.get(ConfigurationOption.booleanOption().buildOptional());
+
// Not really an agent logger, but representing the agent-level logger
agentLogger = LoggerFactory.getLogger(LoggingConfigurationTest.class);
+
+ // A logger created by a plugin CL - see LoggerTestInstrumentation
+ pluginLogger = Objects.requireNonNull(new LoggerTest().getLogger());
}
@AfterAll
static void reset() {
- ElasticApmAgent.reset();
- }
+ if (originalLogFile == null) {
+ System.clearProperty("elastic.apm.log_file");
+ } else {
+ System.setProperty("elastic.apm.log_file", originalLogFile);
+ }
+ if (originalLogFileFormat == null) {
+ System.clearProperty("elastic.apm.log_format_file");
+ } else {
+ System.setProperty("elastic.apm.log_format_file", originalLogFileFormat);
+ }
- @AfterEach
- void tearDown() {
- // restoring the original logger context factory so that other tests are unaffected
LogManager.setFactory(originalLoggerContextFactory);
+ ElasticApmAgent.reset();
}
@Test
void loggingLevelChangeTest() throws IOException {
// Assuming default is debug level in tests based on test.elasticapm.properties
assertThat(agentLogger.isTraceEnabled()).isFalse();
- // A logger created by a plugin CL - see LoggerTestInstrumentation
- Logger pluginLogger = new LoggerTest().getLogger();
- assertThat(pluginLogger).isNotNull();
- LoggerContext pluginLoggerContext = testLog4jContextFactory.getContext(pluginLogger);
+ LoggerContext agentLoggerContext = testLog4jContextFactory.getContext(agentLogger.getName());
+
+ // stagemonitor relies on slf4j, which should be bridged to the same log4j registries and get the same configuration
+ assertThat(configOptionLogger.isTraceEnabled()).isFalse();
+ assertThat(testLog4jContextFactory.getContext(configOptionLogger.getName())).isEqualTo(agentLoggerContext);
+
+ LoggerContext pluginLoggerContext = testLog4jContextFactory.getContext(pluginLogger.getName());
assertThat(pluginLoggerContext).isNotNull();
+ assertThat(pluginLoggerContext).isNotEqualTo(agentLoggerContext);
assertThat(pluginLoggerContext.getName()).startsWith(IndyPluginClassLoader.class.getName());
assertThat(pluginLogger.isTraceEnabled()).isFalse();
logLevelConfig.update(LogLevel.TRACE, SpyConfiguration.CONFIG_SOURCE_NAME);
assertThat(agentLogger.isTraceEnabled()).isTrue();
+ assertThat(configOptionLogger.isTraceEnabled()).isTrue();
assertThat(pluginLogger.isTraceEnabled()).isTrue();
}
+ @Test
+ void testFileLogging() throws IOException {
+ agentLogger.info("agent");
+ configOptionLogger.info("config");
+ pluginLogger.info("plugin");
+ ArrayList logJsonLines = TestUtils.readJsonFile(LOGGING_TEST_FILE);
+ assertThat(logJsonLines).hasSize(3);
+ for (JsonNode logJsonLine : logJsonLines) {
+ assertThat(logJsonLine.get("@timestamp")).isNotNull();
+ assertThat(logJsonLine.get("process.thread.name").textValue()).isEqualTo("main");
+ assertThat(logJsonLine.get("log.level").textValue()).isEqualTo("INFO");
+ assertThat(logJsonLine.get("log.logger")).isNotNull();
+ assertThat(logJsonLine.get("message")).isNotNull();
+ assertThat(logJsonLine.get("ecs.version")).isNotNull();
+ }
+ }
+
private static class LoggerTest {
@Nullable
Logger getLogger() {
@@ -120,10 +179,10 @@ private static final class TestLog4jContextFactory extends Log4jContextFactory {
ContextSelector contextSelector = new TestContextSelector();
@Nullable
- LoggerContext getContext(Logger slf4jLogger) {
+ LoggerContext getContext(String loggerName) {
for (LoggerContext loggerContext : contextSelector.getLoggerContexts()) {
for (org.apache.logging.log4j.core.Logger log4jLogger : loggerContext.getLoggers()) {
- if (log4jLogger.getName().equals(slf4jLogger.getName())) {
+ if (log4jLogger.getName().equals(loggerName)) {
return loggerContext;
}
}
@@ -168,7 +227,7 @@ public void removeContext(org.apache.logging.log4j.spi.LoggerContext context) {
}
}
- private class TestContextSelector implements ContextSelector {
+ private static class TestContextSelector implements ContextSelector {
private final Map contextMap = new HashMap<>();
@Override
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/TestUtils.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/TestUtils.java
new file mode 100644
index 0000000000..00ec7d1f81
--- /dev/null
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/TestUtils.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.apm.agent.logging;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.stream.Stream;
+
+public class TestUtils {
+
+ private final static ObjectMapper objectMapper = new ObjectMapper(); ;
+
+ public static ArrayList readJsonFile(String jsonFilePath) throws IOException {
+ ArrayList jsonFileLines = new ArrayList<>();
+ try (Stream stream = Files.lines(Paths.get(jsonFilePath))) {
+ stream.forEach(line -> {
+ try {
+ jsonFileLines.add(objectMapper.readTree(line));
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+ return jsonFileLines;
+ }
+}
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/instr/LoggerTestInstrumentation.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/instr/LoggerTestInstrumentation.java
index 3a36e00e34..9a85489b29 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/instr/LoggerTestInstrumentation.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/logging/instr/LoggerTestInstrumentation.java
@@ -19,13 +19,13 @@
package co.elastic.apm.agent.logging.instr;
import co.elastic.apm.agent.bci.TracerAwareInstrumentation;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.List;
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/objectpool/impl/BookkeeperObjectPool.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/objectpool/impl/BookkeeperObjectPool.java
index 9d085b8637..ac4ce8292f 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/objectpool/impl/BookkeeperObjectPool.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/objectpool/impl/BookkeeperObjectPool.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.objectpool.impl;
import co.elastic.apm.agent.objectpool.ObjectPool;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Collection;
import java.util.Collections;
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/report/ApmServerClientProxySupportIT.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/report/ApmServerClientProxySupportIT.java
index 9c5fe1feda..3c12ef7cc1 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/report/ApmServerClientProxySupportIT.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/report/ApmServerClientProxySupportIT.java
@@ -26,8 +26,8 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationRegistry;
import org.testcontainers.Testcontainers;
import org.testcontainers.containers.BindMode;
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/testutils/TestContainersUtils.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/testutils/TestContainersUtils.java
index a4965d7258..894401887f 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/testutils/TestContainersUtils.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/testutils/TestContainersUtils.java
@@ -19,7 +19,7 @@
package co.elastic.apm.agent.testutils;
import com.github.dockerjava.api.command.CreateContainerCmd;
-import org.testcontainers.DockerClientFactory;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
import java.util.Objects;
import java.util.function.Consumer;
@@ -32,4 +32,8 @@ private TestContainersUtils() {
public static Consumer withMemoryLimit(int limitMb) {
return cmd -> Objects.requireNonNull(cmd.getHostConfig()).withMemory(limitMb * 1024 * 1024L);
}
+
+ public static Slf4jLogConsumer createSlf4jLogConsumer(Class> loggerOwner) {
+ return new Slf4jLogConsumer(org.slf4j.LoggerFactory.getLogger(loggerOwner));
+ }
}
diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/util/LoggerUtilsTest.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/util/LoggerUtilsTest.java
index 910f3dc32a..66a3e3054b 100644
--- a/apm-agent-core/src/test/java/co/elastic/apm/agent/util/LoggerUtilsTest.java
+++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/util/LoggerUtilsTest.java
@@ -19,8 +19,7 @@
package co.elastic.apm.agent.util;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.Marker;
+import co.elastic.apm.agent.sdk.logging.Logger;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
@@ -45,35 +44,24 @@ void testLogOnce() {
@Test
void testDisabledAfterLogOnce() {
Logger mock = mock(Logger.class);
- Marker marker = mock(Marker.class);
doReturn(true).when(mock).isTraceEnabled();
- doReturn(true).when(mock).isTraceEnabled(marker);
doReturn(true).when(mock).isDebugEnabled();
- doReturn(true).when(mock).isDebugEnabled(marker);
doReturn(true).when(mock).isInfoEnabled();
- doReturn(true).when(mock).isInfoEnabled(marker);
doReturn(true).when(mock).isWarnEnabled();
- doReturn(true).when(mock).isWarnEnabled(marker);
doReturn(true).when(mock).isErrorEnabled();
- doReturn(true).when(mock).isErrorEnabled(marker);
Logger logger = LoggerUtils.logOnce(mock);
- checkAllLevels(logger, marker, true);
+ checkAllLevels(logger, true);
logger.info("once");
- checkAllLevels(logger, marker, false);
+ checkAllLevels(logger, false);
}
- private void checkAllLevels(Logger logger, Marker marker, boolean isEnabled) {
+ private void checkAllLevels(Logger logger, boolean isEnabled) {
assertThat(logger.isTraceEnabled()).isEqualTo(isEnabled);
- assertThat(logger.isTraceEnabled(marker)).isEqualTo(isEnabled);
assertThat(logger.isDebugEnabled()).isEqualTo(isEnabled);
- assertThat(logger.isDebugEnabled(marker)).isEqualTo(isEnabled);
assertThat(logger.isInfoEnabled()).isEqualTo(isEnabled);
- assertThat(logger.isInfoEnabled(marker)).isEqualTo(isEnabled);
assertThat(logger.isWarnEnabled()).isEqualTo(isEnabled);
- assertThat(logger.isWarnEnabled(marker)).isEqualTo(isEnabled);
assertThat(logger.isErrorEnabled()).isEqualTo(isEnabled);
- assertThat(logger.isErrorEnabled(marker)).isEqualTo(isEnabled);
}
}
diff --git a/apm-agent-core/src/test/java/co/elastic/test/ChildFirstURLClassLoader.java b/apm-agent-core/src/test/java/co/elastic/test/ChildFirstURLClassLoader.java
new file mode 100644
index 0000000000..74a3f869d1
--- /dev/null
+++ b/apm-agent-core/src/test/java/co/elastic/test/ChildFirstURLClassLoader.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.test;
+
+import co.elastic.apm.agent.bci.bytebuddy.CustomElementMatchers;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+/**
+ * A Child-first class loader used for tests.
+ * Specifically, used within {@link co.elastic.apm.agent.TestClassWithDependencyRunner} for tests that require encapsulated
+ * test classpath, for example - for testing specific library versions.
+ * In order for classes that are loaded by this class loader to be instrumented, it must be outside of the {@code co.elastic.apm}
+ * package, otherwise it may be excluded if tested through {@link CustomElementMatchers#isAgentClassLoader()}.
+ */
+public class ChildFirstURLClassLoader extends URLClassLoader {
+
+ private final List urls;
+
+ public ChildFirstURLClassLoader(List urls) {
+ super(urls.toArray(new URL[]{}));
+ this.urls = urls;
+ }
+
+ @Override
+ public String getName() {
+ return "Test class class loader: " + urls;
+ }
+
+ @Override
+ protected Class> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
+ try {
+ // First, check if the class has already been loaded
+ Class> c = findLoadedClass(name);
+ if (c == null) {
+ c = findClass(name);
+ if (resolve) {
+ resolveClass(c);
+ }
+ }
+ return c;
+ } catch (ClassNotFoundException e) {
+ return super.loadClass(name, resolve);
+ }
+ }
+ }
+
+
+ @Override
+ public URL findResource(String name) {
+ return super.findResource(name);
+ }
+
+ @Override
+ public Enumeration getResources(String name) throws IOException {
+ Enumeration resources = super.getResources(name);
+ List resourcesList = new ArrayList<>();
+ while (resources.hasMoreElements()) {
+ resourcesList.add(resources.nextElement());
+ }
+ Collections.reverse(resourcesList);
+ return Collections.enumeration(resourcesList);
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+
+}
diff --git a/apm-agent-plugin-sdk/pom.xml b/apm-agent-plugin-sdk/pom.xml
index 7da5b00743..508298849e 100644
--- a/apm-agent-plugin-sdk/pom.xml
+++ b/apm-agent-plugin-sdk/pom.xml
@@ -21,11 +21,6 @@
-
- org.slf4j
- slf4j-api
- ${version.slf4j}
-
net.bytebuddy
byte-buddy-dep
diff --git a/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/ILoggerFactory.java b/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/ILoggerFactory.java
new file mode 100644
index 0000000000..3bb20c2ed4
--- /dev/null
+++ b/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/ILoggerFactory.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.apm.agent.sdk.logging;
+
+public interface ILoggerFactory {
+ /**
+ * Return an appropriate {@link Logger} instance as specified by the
+ * name parameter.
+ *
+ * If the name parameter is equal to {@link Logger#ROOT_LOGGER_NAME}, that is
+ * the string value "ROOT" (case insensitive), then the root logger of the
+ * underlying logging system is returned.
+ *
+ *
Null-valued name arguments are considered invalid.
+ *
+ *
Certain extremely simple logging systems, e.g. NOP, may always
+ * return the same logger instance regardless of the requested name.
+ *
+ * @param name the name of the Logger to return
+ * @return a Logger instance
+ */
+ Logger getLogger(String name);
+}
diff --git a/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/Logger.java b/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/Logger.java
new file mode 100644
index 0000000000..0d69199dd4
--- /dev/null
+++ b/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/Logger.java
@@ -0,0 +1,357 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.apm.agent.sdk.logging;
+
+public interface Logger {
+
+ /**
+ * Case insensitive String constant used to retrieve the name of the root logger.
+ */
+ String ROOT_LOGGER_NAME = "ROOT";
+
+ /**
+ * Return the name of this {@code Logger} instance.
+ * @return name of this logger instance
+ */
+ String getName();
+
+ /**
+ * Is the logger instance enabled for the TRACE level?
+ *
+ * @return True if this Logger is enabled for the TRACE level,
+ * false otherwise.
+ */
+ boolean isTraceEnabled();
+
+ /**
+ * Log a message at the TRACE level.
+ *
+ * @param msg the message string to be logged
+ */
+ void trace(String msg);
+
+ /**
+ * Log a message at the TRACE level according to the specified format
+ * and argument.
+ *
+ *
This form avoids superfluous object creation when the logger
+ * is disabled for the TRACE level.
+ *
+ * @param format the format string
+ * @param arg the argument
+ */
+ void trace(String format, Object arg);
+
+ /**
+ * Log a message at the TRACE level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the TRACE level.
+ *
+ * @param format the format string
+ * @param arg1 the first argument
+ * @param arg2 the second argument
+ */
+ void trace(String format, Object arg1, Object arg2);
+
+ /**
+ * Log a message at the TRACE level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous string concatenation when the logger
+ * is disabled for the TRACE level. However, this variant incurs the hidden
+ * (and relatively small) cost of creating an Object[] before invoking the method,
+ * even if this logger is disabled for TRACE. The variants taking {@link #trace(String, Object) one} and
+ * {@link #trace(String, Object, Object) two} arguments exist solely in order to avoid this hidden cost.
+ *
+ * @param format the format string
+ * @param arguments a list of 3 or more arguments
+ */
+ void trace(String format, Object... arguments);
+
+ /**
+ * Log an exception (throwable) at the TRACE level with an
+ * accompanying message.
+ *
+ * @param msg the message accompanying the exception
+ * @param t the exception (throwable) to log
+ */
+ void trace(String msg, Throwable t);
+
+ /**
+ * Is the logger instance enabled for the DEBUG level?
+ *
+ * @return True if this Logger is enabled for the DEBUG level,
+ * false otherwise.
+ */
+ boolean isDebugEnabled();
+
+ /**
+ * Log a message at the DEBUG level.
+ *
+ * @param msg the message string to be logged
+ */
+ void debug(String msg);
+
+ /**
+ * Log a message at the DEBUG level according to the specified format
+ * and argument.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the DEBUG level.
+ *
+ * @param format the format string
+ * @param arg the argument
+ */
+ void debug(String format, Object arg);
+
+ /**
+ * Log a message at the DEBUG level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the DEBUG level.
+ *
+ * @param format the format string
+ * @param arg1 the first argument
+ * @param arg2 the second argument
+ */
+ void debug(String format, Object arg1, Object arg2);
+
+ /**
+ * Log a message at the DEBUG level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous string concatenation when the logger
+ * is disabled for the DEBUG level. However, this variant incurs the hidden
+ * (and relatively small) cost of creating an Object[] before invoking the method,
+ * even if this logger is disabled for DEBUG. The variants taking
+ * {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
+ * arguments exist solely in order to avoid this hidden cost.
+ *
+ * @param format the format string
+ * @param arguments a list of 3 or more arguments
+ */
+ void debug(String format, Object... arguments);
+
+ /**
+ * Log an exception (throwable) at the DEBUG level with an
+ * accompanying message.
+ *
+ * @param msg the message accompanying the exception
+ * @param t the exception (throwable) to log
+ */
+ void debug(String msg, Throwable t);
+
+ /**
+ * Is the logger instance enabled for the INFO level?
+ *
+ * @return True if this Logger is enabled for the INFO level,
+ * false otherwise.
+ */
+ boolean isInfoEnabled();
+
+ /**
+ * Log a message at the INFO level.
+ *
+ * @param msg the message string to be logged
+ */
+ void info(String msg);
+
+ /**
+ * Log a message at the INFO level according to the specified format
+ * and argument.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the INFO level.
+ *
+ * @param format the format string
+ * @param arg the argument
+ */
+ void info(String format, Object arg);
+
+ /**
+ * Log a message at the INFO level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the INFO level.
+ *
+ * @param format the format string
+ * @param arg1 the first argument
+ * @param arg2 the second argument
+ */
+ void info(String format, Object arg1, Object arg2);
+
+ /**
+ * Log a message at the INFO level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous string concatenation when the logger
+ * is disabled for the INFO level. However, this variant incurs the hidden
+ * (and relatively small) cost of creating an Object[] before invoking the method,
+ * even if this logger is disabled for INFO. The variants taking
+ * {@link #info(String, Object) one} and {@link #info(String, Object, Object) two}
+ * arguments exist solely in order to avoid this hidden cost.
+ *
+ * @param format the format string
+ * @param arguments a list of 3 or more arguments
+ */
+ void info(String format, Object... arguments);
+
+ /**
+ * Log an exception (throwable) at the INFO level with an
+ * accompanying message.
+ *
+ * @param msg the message accompanying the exception
+ * @param t the exception (throwable) to log
+ */
+ void info(String msg, Throwable t);
+
+ /**
+ * Is the logger instance enabled for the WARN level?
+ *
+ * @return True if this Logger is enabled for the WARN level,
+ * false otherwise.
+ */
+ boolean isWarnEnabled();
+
+ /**
+ * Log a message at the WARN level.
+ *
+ * @param msg the message string to be logged
+ */
+ void warn(String msg);
+
+ /**
+ * Log a message at the WARN level according to the specified format
+ * and argument.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the WARN level.
+ *
+ * @param format the format string
+ * @param arg the argument
+ */
+ void warn(String format, Object arg);
+
+ /**
+ * Log a message at the WARN level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous string concatenation when the logger
+ * is disabled for the WARN level. However, this variant incurs the hidden
+ * (and relatively small) cost of creating an Object[] before invoking the method,
+ * even if this logger is disabled for WARN. The variants taking
+ * {@link #warn(String, Object) one} and {@link #warn(String, Object, Object) two}
+ * arguments exist solely in order to avoid this hidden cost.
+ *
+ * @param format the format string
+ * @param arguments a list of 3 or more arguments
+ */
+ void warn(String format, Object... arguments);
+
+ /**
+ * Log a message at the WARN level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the WARN level.
+ *
+ * @param format the format string
+ * @param arg1 the first argument
+ * @param arg2 the second argument
+ */
+ void warn(String format, Object arg1, Object arg2);
+
+ /**
+ * Log an exception (throwable) at the WARN level with an
+ * accompanying message.
+ *
+ * @param msg the message accompanying the exception
+ * @param t the exception (throwable) to log
+ */
+ void warn(String msg, Throwable t);
+
+ /**
+ * Is the logger instance enabled for the ERROR level?
+ *
+ * @return True if this Logger is enabled for the ERROR level,
+ * false otherwise.
+ */
+ boolean isErrorEnabled();
+
+ /**
+ * Log a message at the ERROR level.
+ *
+ * @param msg the message string to be logged
+ */
+ void error(String msg);
+
+ /**
+ * Log a message at the ERROR level according to the specified format
+ * and argument.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the ERROR level.
+ *
+ * @param format the format string
+ * @param arg the argument
+ */
+ void error(String format, Object arg);
+
+ /**
+ * Log a message at the ERROR level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous object creation when the logger
+ * is disabled for the ERROR level.
+ *
+ * @param format the format string
+ * @param arg1 the first argument
+ * @param arg2 the second argument
+ */
+ void error(String format, Object arg1, Object arg2);
+
+ /**
+ * Log a message at the ERROR level according to the specified format
+ * and arguments.
+ *
+ * This form avoids superfluous string concatenation when the logger
+ * is disabled for the ERROR level. However, this variant incurs the hidden
+ * (and relatively small) cost of creating an Object[] before invoking the method,
+ * even if this logger is disabled for ERROR. The variants taking
+ * {@link #error(String, Object) one} and {@link #error(String, Object, Object) two}
+ * arguments exist solely in order to avoid this hidden cost.
+ *
+ * @param format the format string
+ * @param arguments a list of 3 or more arguments
+ */
+ void error(String format, Object... arguments);
+
+ /**
+ * Log an exception (throwable) at the ERROR level with an
+ * accompanying message.
+ *
+ * @param msg the message accompanying the exception
+ * @param t the exception (throwable) to log
+ */
+ void error(String msg, Throwable t);
+}
diff --git a/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/LoggerFactory.java b/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/LoggerFactory.java
new file mode 100644
index 0000000000..c61257d21e
--- /dev/null
+++ b/apm-agent-plugin-sdk/src/main/java/co/elastic/apm/agent/sdk/logging/LoggerFactory.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. 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.
+ */
+package co.elastic.apm.agent.sdk.logging;
+
+public class LoggerFactory {
+
+ private static volatile ILoggerFactory iLoggerFactory;
+
+ public static void initialize(ILoggerFactory iLoggerFactory) {
+ LoggerFactory.iLoggerFactory = iLoggerFactory;
+ }
+
+ /**
+ * Return a logger named according to the name parameter.
+ *
+ * @param name The name of the logger.
+ * @return logger
+ */
+ public static Logger getLogger(String name) {
+ if (iLoggerFactory == null) {
+ return NoopLogger.INSTANCE;
+ }
+ return iLoggerFactory.getLogger(name);
+ }
+
+ /**
+ * Return a logger named corresponding to the class passed as parameter.
+ *
+ * @param clazz the returned logger will be named after clazz
+ * @return logger
+ */
+ public static Logger getLogger(Class> clazz) {
+ return getLogger(clazz.getName());
+ }
+
+ private static class NoopLogger implements Logger {
+
+ static final NoopLogger INSTANCE = new NoopLogger();
+
+ private NoopLogger() {
+ }
+
+ @Override
+ public String getName() {
+ return "null";
+ }
+
+ @Override
+ public boolean isTraceEnabled() {
+ return false;
+ }
+
+ @Override
+ public void trace(String msg) {
+
+ }
+
+ @Override
+ public void trace(String format, Object arg) {
+
+ }
+
+ @Override
+ public void trace(String format, Object arg1, Object arg2) {
+
+ }
+
+ @Override
+ public void trace(String format, Object... arguments) {
+
+ }
+
+ @Override
+ public void trace(String msg, Throwable t) {
+
+ }
+
+ @Override
+ public boolean isDebugEnabled() {
+ return false;
+ }
+
+ @Override
+ public void debug(String msg) {
+
+ }
+
+ @Override
+ public void debug(String format, Object arg) {
+
+ }
+
+ @Override
+ public void debug(String format, Object arg1, Object arg2) {
+
+ }
+
+ @Override
+ public void debug(String format, Object... arguments) {
+
+ }
+
+ @Override
+ public void debug(String msg, Throwable t) {
+
+ }
+
+ @Override
+ public boolean isInfoEnabled() {
+ return false;
+ }
+
+ @Override
+ public void info(String msg) {
+
+ }
+
+ @Override
+ public void info(String format, Object arg) {
+
+ }
+
+ @Override
+ public void info(String format, Object arg1, Object arg2) {
+
+ }
+
+ @Override
+ public void info(String format, Object... arguments) {
+
+ }
+
+ @Override
+ public void info(String msg, Throwable t) {
+
+ }
+
+ @Override
+ public boolean isWarnEnabled() {
+ return false;
+ }
+
+ @Override
+ public void warn(String msg) {
+
+ }
+
+ @Override
+ public void warn(String format, Object arg) {
+
+ }
+
+ @Override
+ public void warn(String format, Object... arguments) {
+
+ }
+
+ @Override
+ public void warn(String format, Object arg1, Object arg2) {
+
+ }
+
+ @Override
+ public void warn(String msg, Throwable t) {
+
+ }
+
+ @Override
+ public boolean isErrorEnabled() {
+ return false;
+ }
+
+ @Override
+ public void error(String msg) {
+
+ }
+
+ @Override
+ public void error(String format, Object arg) {
+
+ }
+
+ @Override
+ public void error(String format, Object arg1, Object arg2) {
+
+ }
+
+ @Override
+ public void error(String format, Object... arguments) {
+
+ }
+
+ @Override
+ public void error(String msg, Throwable t) {
+
+ }
+ }
+}
diff --git a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureSpanInstrumentation.java b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureSpanInstrumentation.java
index 531f69d161..935e6d0eca 100644
--- a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureSpanInstrumentation.java
+++ b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureSpanInstrumentation.java
@@ -33,8 +33,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Arrays;
diff --git a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureTransactionInstrumentation.java b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureTransactionInstrumentation.java
index 63a14fa2bc..33e5db9bb3 100644
--- a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureTransactionInstrumentation.java
+++ b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/CaptureTransactionInstrumentation.java
@@ -32,8 +32,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Arrays;
diff --git a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderExtractorBridge.java b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderExtractorBridge.java
index da198e8629..fb86e718e2 100644
--- a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderExtractorBridge.java
+++ b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderExtractorBridge.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.impl.transaction.AbstractHeaderGetter;
import co.elastic.apm.agent.impl.transaction.TextHeaderGetter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
diff --git a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderInjectorBridge.java b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderInjectorBridge.java
index b721bc0195..251341c8a7 100644
--- a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderInjectorBridge.java
+++ b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeaderInjectorBridge.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.pluginapi;
import co.elastic.apm.agent.impl.transaction.TextHeaderSetter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
diff --git a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeadersExtractorBridge.java b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeadersExtractorBridge.java
index 3cf3c40d85..2948febeed 100644
--- a/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeadersExtractorBridge.java
+++ b/apm-agent-plugins/apm-api-plugin/src/main/java/co/elastic/apm/agent/pluginapi/HeadersExtractorBridge.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.pluginapi;
import co.elastic.apm.agent.impl.transaction.TextHeaderGetter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
diff --git a/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractAPIGatewayTransactionHelper.java b/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractAPIGatewayTransactionHelper.java
index 2e3a514294..ab071104de 100644
--- a/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractAPIGatewayTransactionHelper.java
+++ b/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractAPIGatewayTransactionHelper.java
@@ -28,8 +28,8 @@
import co.elastic.apm.agent.impl.transaction.Transaction;
import co.elastic.apm.agent.matcher.WildcardMatcher;
import com.amazonaws.services.lambda.runtime.Context;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.nio.CharBuffer;
diff --git a/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractLambdaTransactionHelper.java b/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractLambdaTransactionHelper.java
index b8ea3a8690..31c300f891 100644
--- a/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractLambdaTransactionHelper.java
+++ b/apm-agent-plugins/apm-awslambda-plugin/src/main/java/co/elastic/apm/agent/awslambda/helper/AbstractLambdaTransactionHelper.java
@@ -30,8 +30,8 @@
import co.elastic.apm.agent.util.VersionUtils;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.concurrent.TimeUnit;
diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra3InstrumentationIT.java b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra3InstrumentationIT.java
index aa43bd476f..31fd960085 100644
--- a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra3InstrumentationIT.java
+++ b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra3InstrumentationIT.java
@@ -27,15 +27,11 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.time.Duration;
-import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
@@ -44,12 +40,10 @@
@Testcontainers
class Cassandra3InstrumentationIT extends AbstractInstrumentationTest {
- private static final Logger logger = LoggerFactory.getLogger(Cassandra3InstrumentationIT.class);
-
@Container
public static GenericContainer> cassandra = new GenericContainer<>("cassandra:3.11")
.withExposedPorts(9042)
- .withLogConsumer(new Slf4jLogConsumer(logger))
+ .withLogConsumer(TestContainersUtils.createSlf4jLogConsumer(Cassandra3InstrumentationIT.class))
.withStartupTimeout(Duration.ofSeconds(120))
.withCreateContainerCmdModifier(TestContainersUtils.withMemoryLimit(2048))
.withEnv("HEAP_NEWSIZE", "700m")
diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra4InstrumentationIT.java b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra4InstrumentationIT.java
index 10df9c6203..4b8c594029 100644
--- a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra4InstrumentationIT.java
+++ b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/test/java/co/elastic/apm/agent/cassandra/Cassandra4InstrumentationIT.java
@@ -25,15 +25,11 @@
import com.datastax.oss.driver.api.core.config.DefaultDriverOption;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import com.datastax.oss.driver.api.core.session.Session;
-import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -47,12 +43,10 @@
@Testcontainers
class Cassandra4InstrumentationIT extends AbstractInstrumentationTest {
- private static final Logger logger = LoggerFactory.getLogger(Cassandra4InstrumentationIT.class);
-
@Container
public static GenericContainer> cassandra = new GenericContainer<>("cassandra:4.0")
.withExposedPorts(9042)
- .withLogConsumer(new Slf4jLogConsumer(logger))
+ .withLogConsumer(TestContainersUtils.createSlf4jLogConsumer(Cassandra4InstrumentationIT.class))
.withStartupTimeout(Duration.ofSeconds(120))
.withCreateContainerCmdModifier(TestContainersUtils.withMemoryLimit(2048))
.withEnv("HEAP_NEWSIZE", "700m")
diff --git a/apm-agent-plugins/apm-es-restclient-plugin/apm-es-restclient-plugin-common/src/main/java/co/elastic/apm/agent/esrestclient/ElasticsearchRestClientInstrumentationHelper.java b/apm-agent-plugins/apm-es-restclient-plugin/apm-es-restclient-plugin-common/src/main/java/co/elastic/apm/agent/esrestclient/ElasticsearchRestClientInstrumentationHelper.java
index db66f237ac..7e693389d3 100644
--- a/apm-agent-plugins/apm-es-restclient-plugin/apm-es-restclient-plugin-common/src/main/java/co/elastic/apm/agent/esrestclient/ElasticsearchRestClientInstrumentationHelper.java
+++ b/apm-agent-plugins/apm-es-restclient-plugin/apm-es-restclient-plugin-common/src/main/java/co/elastic/apm/agent/esrestclient/ElasticsearchRestClientInstrumentationHelper.java
@@ -34,8 +34,8 @@
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.client.ResponseListener;
import org.jctools.queues.atomic.AtomicQueueFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.IOException;
diff --git a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/AbstractGrpcClientInstrumentationTest.java b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/AbstractGrpcClientInstrumentationTest.java
index effa54ff40..469bb28061 100644
--- a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/AbstractGrpcClientInstrumentationTest.java
+++ b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/AbstractGrpcClientInstrumentationTest.java
@@ -30,8 +30,8 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Arrays;
import java.util.concurrent.CyclicBarrier;
diff --git a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/AbstractGrpcAppTest.java b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/AbstractGrpcAppTest.java
index 1d0690b531..450a6ae9e2 100644
--- a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/AbstractGrpcAppTest.java
+++ b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/AbstractGrpcAppTest.java
@@ -22,8 +22,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Arrays;
import java.util.List;
diff --git a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloClient.java b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloClient.java
index 49d95000c1..7d2614b127 100644
--- a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloClient.java
+++ b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloClient.java
@@ -28,8 +28,8 @@
import io.grpc.MethodDescriptor;
import io.grpc.StatusRuntimeException;
import io.grpc.stub.StreamObserver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.List;
import java.util.concurrent.CountDownLatch;
diff --git a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloServer.java b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloServer.java
index 913baab664..e89e434436 100644
--- a/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloServer.java
+++ b/apm-agent-plugins/apm-grpc/apm-grpc-plugin/src/test/java/co/elastic/apm/agent/grpc/testapp/HelloServer.java
@@ -28,8 +28,8 @@
import io.grpc.ServerInterceptor;
import io.grpc.Status;
import io.grpc.stub.StreamObserver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
diff --git a/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java b/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java
index 1be82346ae..f1b6d1f7be 100644
--- a/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java
+++ b/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java
@@ -21,8 +21,8 @@
import co.elastic.apm.agent.impl.context.Destination;
import co.elastic.apm.agent.impl.transaction.AbstractSpan;
import co.elastic.apm.agent.impl.transaction.Span;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.net.URI;
diff --git a/apm-agent-plugins/apm-javalin-plugin/src/main/java/co/elastic/apm/agent/javalin/JavalinInstrumentation.java b/apm-agent-plugins/apm-javalin-plugin/src/main/java/co/elastic/apm/agent/javalin/JavalinInstrumentation.java
index 25161b2a42..743efde0e8 100644
--- a/apm-agent-plugins/apm-javalin-plugin/src/main/java/co/elastic/apm/agent/javalin/JavalinInstrumentation.java
+++ b/apm-agent-plugins/apm-javalin-plugin/src/main/java/co/elastic/apm/agent/javalin/JavalinInstrumentation.java
@@ -33,8 +33,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
diff --git a/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/ConnectionMetaData.java b/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/ConnectionMetaData.java
index c20f822526..c3e1b3fb06 100644
--- a/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/ConnectionMetaData.java
+++ b/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/ConnectionMetaData.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.jdbc.helper;
import co.elastic.apm.agent.sdk.state.GlobalState;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.ArrayDeque;
diff --git a/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/JdbcHelper.java b/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/JdbcHelper.java
index d3c6a08f25..abe2db4615 100644
--- a/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/JdbcHelper.java
+++ b/apm-agent-plugins/apm-jdbc-plugin/src/main/java/co/elastic/apm/agent/jdbc/helper/JdbcHelper.java
@@ -25,8 +25,8 @@
import co.elastic.apm.agent.impl.transaction.Span;
import co.elastic.apm.agent.jdbc.JdbcFilter;
import co.elastic.apm.agent.sdk.weakconcurrent.WeakMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.sql.Connection;
diff --git a/apm-agent-plugins/apm-jdk-httpserver-plugin/src/main/java/co/elastic/apm/agent/httpserver/HttpHandlerAdvice.java b/apm-agent-plugins/apm-jdk-httpserver-plugin/src/main/java/co/elastic/apm/agent/httpserver/HttpHandlerAdvice.java
index a538055176..a06738d843 100644
--- a/apm-agent-plugins/apm-jdk-httpserver-plugin/src/main/java/co/elastic/apm/agent/httpserver/HttpHandlerAdvice.java
+++ b/apm-agent-plugins/apm-jdk-httpserver-plugin/src/main/java/co/elastic/apm/agent/httpserver/HttpHandlerAdvice.java
@@ -33,8 +33,8 @@
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpsExchange;
import net.bytebuddy.asm.Advice;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Collections;
diff --git a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsInstrumentationHelper.java b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsInstrumentationHelper.java
index 75b3e4e253..4909c589be 100644
--- a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsInstrumentationHelper.java
+++ b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsInstrumentationHelper.java
@@ -26,8 +26,8 @@
import co.elastic.apm.agent.impl.transaction.TraceContext;
import co.elastic.apm.agent.impl.transaction.Transaction;
import co.elastic.apm.agent.matcher.WildcardMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import javax.jms.Destination;
diff --git a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageConsumerInstrumentation.java b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageConsumerInstrumentation.java
index d469a21c88..70a1cafd68 100644
--- a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageConsumerInstrumentation.java
+++ b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageConsumerInstrumentation.java
@@ -28,8 +28,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import javax.jms.Destination;
diff --git a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageListenerInstrumentation.java b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageListenerInstrumentation.java
index 0e835bb71a..8429b8c1cf 100644
--- a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageListenerInstrumentation.java
+++ b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageListenerInstrumentation.java
@@ -23,8 +23,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import javax.jms.Destination;
diff --git a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageProducerInstrumentation.java b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageProducerInstrumentation.java
index 06a0b6f2b7..cfa8f3fec4 100644
--- a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageProducerInstrumentation.java
+++ b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessageProducerInstrumentation.java
@@ -24,8 +24,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import javax.jms.Destination;
diff --git a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessagePropertyAccessor.java b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessagePropertyAccessor.java
index 21fb71926d..ee0b5c6ea9 100644
--- a/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessagePropertyAccessor.java
+++ b/apm-agent-plugins/apm-jms-plugin/apm-jms-plugin-base/src/main/java/co/elastic/apm/agent/jms/JmsMessagePropertyAccessor.java
@@ -22,8 +22,8 @@
import co.elastic.apm.agent.impl.transaction.TextHeaderGetter;
import co.elastic.apm.agent.impl.transaction.TextHeaderSetter;
import co.elastic.apm.agent.impl.transaction.TraceContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-jmx-plugin/src/main/java/co/elastic/apm/agent/jmx/JmxMetricTracker.java b/apm-agent-plugins/apm-jmx-plugin/src/main/java/co/elastic/apm/agent/jmx/JmxMetricTracker.java
index be99094654..8e5c60d19a 100644
--- a/apm-agent-plugins/apm-jmx-plugin/src/main/java/co/elastic/apm/agent/jmx/JmxMetricTracker.java
+++ b/apm-agent-plugins/apm-jmx-plugin/src/main/java/co/elastic/apm/agent/jmx/JmxMetricTracker.java
@@ -24,8 +24,8 @@
import co.elastic.apm.agent.metrics.Labels;
import co.elastic.apm.agent.metrics.MetricRegistry;
import co.elastic.apm.agent.util.GlobalLocks;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationOption;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-base-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHelper.java b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-base-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHelper.java
index 6d58c08e6f..fb2d81b5f7 100644
--- a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-base-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHelper.java
+++ b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-base-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHelper.java
@@ -32,8 +32,8 @@
import org.apache.kafka.common.Node;
import org.apache.kafka.common.PartitionInfo;
import org.jctools.queues.atomic.AtomicQueueFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.List;
diff --git a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/KafkaProducerHeadersInstrumentation.java b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/KafkaProducerHeadersInstrumentation.java
index e333fb73a5..bec7ec0916 100644
--- a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/KafkaProducerHeadersInstrumentation.java
+++ b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/KafkaProducerHeadersInstrumentation.java
@@ -31,8 +31,8 @@
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.record.RecordBatch;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ConsumerRecordsIteratorWrapper.java b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ConsumerRecordsIteratorWrapper.java
index 0b401815c2..b336cd2589 100644
--- a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ConsumerRecordsIteratorWrapper.java
+++ b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ConsumerRecordsIteratorWrapper.java
@@ -28,8 +28,8 @@
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.header.Header;
import org.apache.kafka.common.record.TimestampType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Iterator;
diff --git a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ElasticHeaderImpl.java b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ElasticHeaderImpl.java
index ba525dcdd1..171c40f2c1 100644
--- a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ElasticHeaderImpl.java
+++ b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/ElasticHeaderImpl.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.kafka.helper;
import org.apache.kafka.common.header.Header;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHeadersHelper.java b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHeadersHelper.java
index 83ee7fb7fc..5e1a62d386 100644
--- a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHeadersHelper.java
+++ b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaInstrumentationHeadersHelper.java
@@ -24,8 +24,8 @@
import co.elastic.apm.agent.impl.transaction.TraceContext;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.producer.ProducerRecord;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Iterator;
import java.util.List;
diff --git a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaRecordHeaderAccessor.java b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaRecordHeaderAccessor.java
index 0894304c59..3a7ab474d7 100644
--- a/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaRecordHeaderAccessor.java
+++ b/apm-agent-plugins/apm-kafka-plugin/apm-kafka-headers-plugin/src/main/java/co/elastic/apm/agent/kafka/helper/KafkaRecordHeaderAccessor.java
@@ -24,8 +24,8 @@
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.header.Header;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.HashMap;
diff --git a/apm-agent-plugins/apm-log-correlation-plugin/src/main/java/co/elastic/apm/agent/mdc/MdcActivationListener.java b/apm-agent-plugins/apm-log-correlation-plugin/src/main/java/co/elastic/apm/agent/mdc/MdcActivationListener.java
index 4cae3403f8..769e94a800 100644
--- a/apm-agent-plugins/apm-log-correlation-plugin/src/main/java/co/elastic/apm/agent/mdc/MdcActivationListener.java
+++ b/apm-agent-plugins/apm-log-correlation-plugin/src/main/java/co/elastic/apm/agent/mdc/MdcActivationListener.java
@@ -25,8 +25,8 @@
import co.elastic.apm.agent.impl.transaction.AbstractSpan;
import co.elastic.apm.agent.impl.transaction.TraceContext;
import co.elastic.apm.agent.logging.LoggingConfiguration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
diff --git a/apm-agent-plugins/apm-log-correlation-plugin/src/test/java/co/elastic/apm/agent/mdc/MdcActivationListenerIT.java b/apm-agent-plugins/apm-log-correlation-plugin/src/test/java/co/elastic/apm/agent/mdc/MdcActivationListenerIT.java
index 2d3328e07c..056ec1d9d2 100644
--- a/apm-agent-plugins/apm-log-correlation-plugin/src/test/java/co/elastic/apm/agent/mdc/MdcActivationListenerIT.java
+++ b/apm-agent-plugins/apm-log-correlation-plugin/src/test/java/co/elastic/apm/agent/mdc/MdcActivationListenerIT.java
@@ -25,7 +25,6 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.stubbing.Answer;
-import org.slf4j.Logger;
import org.slf4j.MDC;
import static org.assertj.core.api.Assertions.assertThat;
@@ -51,7 +50,7 @@ void setUp() {
@Test
void testVerifyThatWithEnabledCorrelationAndLoggedErrorMdcErrorIdIsNotBlankWithSlf4j() {
when(loggingConfiguration.isLogCorrelationEnabled()).thenReturn(true);
- Logger mockedLogger = mock(Logger.class);
+ org.slf4j.Logger mockedLogger = mock(org.slf4j.Logger.class);
doAnswer(invocation -> assertMdcErrorIdIsNotEmpty()).when(mockedLogger).error(anyString(), any(Exception.class));
assertMdcErrorIdIsEmpty();
@@ -70,7 +69,7 @@ void testVerifyThatWithEnabledCorrelationAndLoggedErrorMdcErrorIdIsNotBlankWithS
@Test
void testVerifyThatWithEnabledCorrelationAndLoggedErrorMdcErrorIdIsNotBlankWithSlf4jNotInTransaction() {
when(loggingConfiguration.isLogCorrelationEnabled()).thenReturn(true);
- Logger mockedLogger = mock(Logger.class);
+ org.slf4j.Logger mockedLogger = mock(org.slf4j.Logger.class);
doAnswer(invocation -> assertMdcErrorIdIsNotEmpty()).when(mockedLogger).error(anyString(), any(Exception.class));
assertMdcErrorIdIsEmpty();
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/main/java/co/elastic/apm/agent/log/shader/AbstractEcsReformattingHelper.java b/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/main/java/co/elastic/apm/agent/log/shader/AbstractEcsReformattingHelper.java
index ee0598be8e..6e07de5723 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/main/java/co/elastic/apm/agent/log/shader/AbstractEcsReformattingHelper.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/main/java/co/elastic/apm/agent/log/shader/AbstractEcsReformattingHelper.java
@@ -32,8 +32,8 @@
import co.elastic.apm.agent.sdk.state.GlobalState;
import co.elastic.apm.agent.sdk.weakconcurrent.WeakConcurrent;
import co.elastic.apm.agent.sdk.weakconcurrent.WeakMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.List;
@@ -106,8 +106,9 @@ public abstract class AbstractEcsReformattingHelper {
// Escape shading
private static final String ECS_LOGGING_PACKAGE_NAME = "co.elastic.logging";
- // We can use regular shaded logging here as this class is loaded from the agent CL
+ // We can use regular agent logging here as this class is loaded from the agent CL
private static final Logger logger = LoggerFactory.getLogger(AbstractEcsReformattingHelper.class);
+
public static final String ECS_SHADE_APPENDER_NAME = "EcsShadeAppender";
// Used to cache the fact that ECS-formatter or ECS-appender are not created for a given appender
@@ -463,16 +464,4 @@ protected long getMaxLogFileSize() {
}
protected abstract void closeShadeAppender(A shadeAppender);
-
- /*********************************************************************************************************************
- * Since we shade slf4j in submodules, the following methods provide a way to properly log a message to the agent log
- ********************************************************************************************************************/
-
- protected void logInfo(String message) {
- logger.info(message);
- }
-
- protected void logError(String message, Throwable throwable) {
- logger.error(message, throwable);
- }
}
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/test/java/co/elastic/apm/agent/log/shader/LogShadingInstrumentationTest.java b/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/test/java/co/elastic/apm/agent/log/shader/LogShadingInstrumentationTest.java
index b0c8650352..2c3ea39d18 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/test/java/co/elastic/apm/agent/log/shader/LogShadingInstrumentationTest.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-log-shader-plugin-common/src/test/java/co/elastic/apm/agent/log/shader/LogShadingInstrumentationTest.java
@@ -22,7 +22,7 @@
import co.elastic.apm.agent.configuration.CoreConfiguration;
import co.elastic.apm.agent.logging.LogEcsReformatting;
import co.elastic.apm.agent.logging.LoggingConfiguration;
-import com.fasterxml.jackson.core.JsonProcessingException;
+import co.elastic.apm.agent.logging.TestUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.AfterEach;
@@ -210,7 +210,7 @@ public void testLogOverride() throws IOException {
logger.warn(WARN_MESSAGE);
logger.error(ERROR_MESSAGE);
- ArrayList overriddenLogEvents = readEcsLogFile(getOriginalLogFilePath().toString());
+ ArrayList overriddenLogEvents = TestUtils.readJsonFile(getOriginalLogFilePath().toString());
assertThat(overriddenLogEvents).hasSize(4);
for (JsonNode ecsLogLineTree : overriddenLogEvents) {
verifyEcsLogLine(ecsLogLineTree);
@@ -292,22 +292,7 @@ private void verifyEcsLogLine(JsonNode ecsLogLineTree) {
@Nonnull
private ArrayList readShadeLogFile() throws IOException {
- return readEcsLogFile(getShadeLogFilePath());
- }
-
- @Nonnull
- private ArrayList readEcsLogFile(String shadeLogFilePath) throws IOException {
- ArrayList ecsLogLines = new ArrayList<>();
- try (Stream stream = Files.lines(Paths.get(shadeLogFilePath))) {
- stream.forEach(line -> {
- try {
- ecsLogLines.add(objectMapper.readTree(line));
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- }
- });
- }
- return ecsLogLines;
+ return TestUtils.readJsonFile(getShadeLogFilePath());
}
@Nonnull
@@ -381,7 +366,7 @@ public void testShadeLogRolling() throws IOException {
// log4j1 this happens AFTER the event is logged. This means we can only count on the non-active file to
// contain a single line
String shadeLogFilePath = getShadeLogFilePath();
- ArrayList jsonNodes = readEcsLogFile(shadeLogFilePath + ".1");
+ ArrayList jsonNodes = TestUtils.readJsonFile(shadeLogFilePath + ".1");
assertThat(jsonNodes).hasSize(1);
}
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j1-plugin/src/main/java/co/elastic/apm/agent/log4j1/Log4J1EcsReformattingHelper.java b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j1-plugin/src/main/java/co/elastic/apm/agent/log4j1/Log4J1EcsReformattingHelper.java
index 03ef1037c4..64c8683aa2 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j1-plugin/src/main/java/co/elastic/apm/agent/log4j1/Log4J1EcsReformattingHelper.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j1-plugin/src/main/java/co/elastic/apm/agent/log4j1/Log4J1EcsReformattingHelper.java
@@ -21,6 +21,8 @@
import co.elastic.apm.agent.log.shader.AbstractEcsReformattingHelper;
import co.elastic.apm.agent.log.shader.Utils;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import co.elastic.logging.log4j.EcsLayout;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Layout;
@@ -33,6 +35,8 @@
class Log4J1EcsReformattingHelper extends AbstractEcsReformattingHelper {
+ private static final Logger logger = LoggerFactory.getLogger(Log4J1EcsReformattingHelper.class);
+
Log4J1EcsReformattingHelper() {}
@Nullable
@@ -84,7 +88,7 @@ protected WriterAppender createAndStartEcsAppender(WriterAppender originalAppend
shadeAppender.setName(ecsAppenderName);
shadeAppender.setLayout(ecsLayout);
} catch (IOException e) {
- logError("Failed to create Log shading FileAppender. Auto ECS reformatting will not work.", e);
+ logger.error("Failed to create Log shading FileAppender. Auto ECS reformatting will not work.", e);
}
}
return shadeAppender;
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4J2EcsReformattingHelper.java b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4J2EcsReformattingHelper.java
index 108d4ca8d0..322dddff22 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4J2EcsReformattingHelper.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4J2EcsReformattingHelper.java
@@ -20,6 +20,8 @@
import co.elastic.apm.agent.log.shader.AbstractEcsReformattingHelper;
import co.elastic.apm.agent.log.shader.Utils;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import co.elastic.logging.log4j2.EcsLayout;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Layout;
@@ -44,6 +46,8 @@
class Log4J2EcsReformattingHelper extends AbstractEcsReformattingHelper> {
+ private static final Logger logger = LoggerFactory.getLogger(Log4J2EcsReformattingHelper.class);
+
Log4J2EcsReformattingHelper() {}
@Nullable
@@ -103,7 +107,7 @@ protected Appender createAndStartEcsAppender(Appender originalAppender, String e
Method getFileNameMethod = originalAppender.getClass().getDeclaredMethod("getFileName");
logFile = (String) getFileNameMethod.invoke(originalAppender);
} catch (Exception e) {
- logError("Failed to obtain log file name from file appender", e);
+ logger.error("Failed to obtain log file name from file appender", e);
}
}
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4j2EcsReformattingInstrumentation.java b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4j2EcsReformattingInstrumentation.java
index 9672b83ca5..197a047e65 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4j2EcsReformattingInstrumentation.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/main/java/co/elastic/apm/agent/log4j2/Log4j2EcsReformattingInstrumentation.java
@@ -31,10 +31,8 @@
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
import static net.bytebuddy.matcher.ElementMatchers.isBootstrapClassLoader;
import static net.bytebuddy.matcher.ElementMatchers.nameContains;
-import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not;
-import static net.bytebuddy.matcher.ElementMatchers.ofType;
import static net.bytebuddy.matcher.ElementMatchers.returns;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/test/java/co/elastic/apm/agent/log4j2/LegacyLog4j2ShadingTestRunner.java b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/test/java/co/elastic/apm/agent/log4j2/LegacyLog4j2ShadingTestRunner.java
index 7954879083..a13b6777f6 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/test/java/co/elastic/apm/agent/log4j2/LegacyLog4j2ShadingTestRunner.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-log4j2-plugin/src/test/java/co/elastic/apm/agent/log4j2/LegacyLog4j2ShadingTestRunner.java
@@ -30,10 +30,10 @@ public LegacyLog4j2ShadingTestRunner() throws Exception {
List dependencies = List.of(
"org.apache.logging.log4j:log4j-core:2.6",
"org.apache.logging.log4j:log4j-api:2.6",
- "co.elastic.logging:log4j2-ecs-layout:1.1.0"
+ "co.elastic.logging:log4j2-ecs-layout:1.3.2"
);
runner = new TestClassWithDependencyRunner(dependencies, LegacyLog4j2ShadingTest.class, Log4j2ShadingTest.class,
- Log4J2EcsReformattingHelper.class, Log4j2ShadingTest.Log4j2LoggerFacade.class);
+ Log4j2ShadingTest.Log4j2LoggerFacade.class);
}
@Test
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/LogbackEcsReformattingHelper.java b/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/LogbackEcsReformattingHelper.java
index a2e99b0936..92b25e1f55 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/LogbackEcsReformattingHelper.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/LogbackEcsReformattingHelper.java
@@ -30,6 +30,8 @@
import co.elastic.apm.agent.log.shader.AbstractEcsReformattingHelper;
import co.elastic.apm.agent.log.shader.Utils;
import co.elastic.apm.agent.matcher.WildcardMatcher;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import co.elastic.logging.AdditionalField;
import co.elastic.logging.logback.EcsEncoder;
@@ -39,6 +41,8 @@
class LogbackEcsReformattingHelper extends AbstractEcsReformattingHelper, Encoder> {
+ private static final Logger logger = LoggerFactory.getLogger(LogbackEcsReformattingHelper.class);
+
private static final LoggerContext defaultLoggerContext = new LoggerContext();
LogbackEcsReformattingHelper() {}
@@ -117,8 +121,7 @@ protected OutputStreamAppender createAndStartEcsAppender(OutputSt
try {
VersionUtils.setMaxFileSize(triggeringPolicy, getMaxLogFileSize());
} catch (Throwable throwable) {
- // We cannot log here because this plugin escapes slf4j package reallocation.
- logInfo("Failed to set max file size for log shader file-rolling strategy. Using the default " +
+ logger.info("Failed to set max file size for log shader file-rolling strategy. Using the default " +
"Logback setting instead - " + SizeBasedTriggeringPolicy.DEFAULT_MAX_FILE_SIZE + ". Error message: " +
throwable.getMessage());
}
@@ -128,10 +131,9 @@ protected OutputStreamAppender createAndStartEcsAppender(OutputSt
ecsAppender.setContext(defaultLoggerContext);
try {
- VersionUtils.copyImmediateFlushSetting(originalAppender);
+ VersionUtils.copyImmediateFlushSetting(originalAppender, ecsAppender);
} catch (Throwable throwable) {
- // We cannot log here because this plugin escapes slf4j package reallocation.
- // Writing to System out may be too much for this.
+ logger.info("Failed to set immediate-flush for the custom ECS appender");
}
ecsAppender.setAppend(true);
ecsAppender.setName(ecsAppenderName);
diff --git a/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/VersionUtils.java b/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/VersionUtils.java
index f59dd267b3..78d1bfdda0 100644
--- a/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/VersionUtils.java
+++ b/apm-agent-plugins/apm-log-shader-plugin/apm-logback-plugin/apm-logback-plugin-impl/src/main/java/co/elastic/apm/agent/logback/VersionUtils.java
@@ -93,13 +93,14 @@ static void setMaxFileSize(SizeBasedTriggeringPolicy> policy, long maxFileSize
* In older versions, this feature was controlled through the encoders. Since we are using
* {@link co.elastic.logging.logback.EcsEncoder}, the shaded logs will always be written as if {@code immediateFlush}
* is set to {@code true} in versions <1.2.0
- * @param appender the appender to configure
+ * @param originalAppender the original appender
+ * @param ecsAppender the custom ECS appender
*/
- static void copyImmediateFlushSetting(OutputStreamAppender> appender) throws Throwable {
+ static void copyImmediateFlushSetting(OutputStreamAppender> originalAppender, OutputStreamAppender> ecsAppender) throws Throwable {
if (setImmediateFlushMethod != null && isImmediateFlushMethod != null) {
- boolean immediateFlushSet = (boolean) isImmediateFlushMethod.invoke(appender);
- setImmediateFlushMethod.invoke(appender, immediateFlushSet);
+ boolean immediateFlushSet = (boolean) isImmediateFlushMethod.invoke(originalAppender);
+ setImmediateFlushMethod.invoke(ecsAppender, immediateFlushSet);
}
}
}
diff --git a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/ApmServerLogShipper.java b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/ApmServerLogShipper.java
index 5caccb45b4..d4acd27a0c 100644
--- a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/ApmServerLogShipper.java
+++ b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/ApmServerLogShipper.java
@@ -23,8 +23,8 @@
import co.elastic.apm.agent.report.ReporterConfiguration;
import co.elastic.apm.agent.report.serialize.PayloadSerializer;
import com.dslplatform.json.JsonWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.File;
diff --git a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/FileTailer.java b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/FileTailer.java
index 340e05fddb..9b08767bac 100644
--- a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/FileTailer.java
+++ b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/FileTailer.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.log.shipper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.io.File;
import java.io.IOException;
diff --git a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/LogShipperFactory.java b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/LogShipperFactory.java
index a89114a7fa..e69e20ce1e 100644
--- a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/LogShipperFactory.java
+++ b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/LogShipperFactory.java
@@ -29,8 +29,8 @@
import co.elastic.apm.agent.report.serialize.DslJsonSerializer;
import co.elastic.apm.agent.util.ExecutorUtils;
import co.elastic.apm.agent.common.ThreadUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.io.File;
import java.io.IOException;
diff --git a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/TailableFile.java b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/TailableFile.java
index 59503bad7a..2a21c1eb82 100644
--- a/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/TailableFile.java
+++ b/apm-agent-plugins/apm-log-shipper-plugin/src/main/java/co/elastic/apm/agent/log/shipper/TailableFile.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.log.shipper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.Closeable;
diff --git a/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMeterRegistrySerializer.java b/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMeterRegistrySerializer.java
index 14fd3adebb..67ddc46d0d 100644
--- a/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMeterRegistrySerializer.java
+++ b/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMeterRegistrySerializer.java
@@ -34,8 +34,8 @@
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Timer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
diff --git a/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMetricsReporter.java b/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMetricsReporter.java
index 2c89b3a50f..2bdb061597 100644
--- a/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMetricsReporter.java
+++ b/apm-agent-plugins/apm-micrometer-plugin/src/main/java/co/elastic/apm/agent/micrometer/MicrometerMetricsReporter.java
@@ -30,8 +30,8 @@
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.io.Closeable;
import java.util.HashMap;
diff --git a/apm-agent-plugins/apm-mongoclient-plugin/src/main/java/co/elastic/apm/agent/mongoclient/ConnectionAdvice.java b/apm-agent-plugins/apm-mongoclient-plugin/src/main/java/co/elastic/apm/agent/mongoclient/ConnectionAdvice.java
index 3840658ce8..274ecf064c 100644
--- a/apm-agent-plugins/apm-mongoclient-plugin/src/main/java/co/elastic/apm/agent/mongoclient/ConnectionAdvice.java
+++ b/apm-agent-plugins/apm-mongoclient-plugin/src/main/java/co/elastic/apm/agent/mongoclient/ConnectionAdvice.java
@@ -27,8 +27,8 @@
import net.bytebuddy.asm.Advice;
import org.bson.BsonDocument;
import org.bson.BsonValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java
index dac3e1611b..1c4966c42f 100644
--- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java
+++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java
@@ -34,8 +34,8 @@
import okhttp3.HttpUrl;
import okhttp3.Request;
import okhttp3.Response;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.IOException;
diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java
index ac40ecbdf1..edc210c2f8 100644
--- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java
+++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java
@@ -33,8 +33,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.IOException;
diff --git a/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanBuilderInstrumentation.java b/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanBuilderInstrumentation.java
index 208b4c0034..e493a65301 100644
--- a/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanBuilderInstrumentation.java
+++ b/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanBuilderInstrumentation.java
@@ -30,8 +30,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Map;
diff --git a/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanInstrumentation.java b/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanInstrumentation.java
index a35ad8d970..c6c79fed14 100644
--- a/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanInstrumentation.java
+++ b/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/ApmSpanInstrumentation.java
@@ -27,8 +27,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Map;
diff --git a/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/SpanContextInstrumentation.java b/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/SpanContextInstrumentation.java
index 37b40afc5a..753b7de841 100644
--- a/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/SpanContextInstrumentation.java
+++ b/apm-agent-plugins/apm-opentracing-plugin/src/main/java/co/elastic/apm/agent/opentracingimpl/SpanContextInstrumentation.java
@@ -24,8 +24,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.assign.Assigner;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.HashMap;
diff --git a/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/CallTree.java b/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/CallTree.java
index fc85955b1f..6decb709a9 100644
--- a/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/CallTree.java
+++ b/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/CallTree.java
@@ -26,8 +26,8 @@
import co.elastic.apm.agent.objectpool.ObjectPool;
import co.elastic.apm.agent.objectpool.Recyclable;
import co.elastic.apm.agent.profiler.collections.LongHashSet;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.IOException;
diff --git a/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/SamplingProfiler.java b/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/SamplingProfiler.java
index a817dfbf15..d288220b13 100644
--- a/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/SamplingProfiler.java
+++ b/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/SamplingProfiler.java
@@ -40,8 +40,8 @@
import com.lmax.disruptor.Sequence;
import com.lmax.disruptor.SequenceBarrier;
import com.lmax.disruptor.WaitStrategy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.File;
diff --git a/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/asyncprofiler/JfrParser.java b/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/asyncprofiler/JfrParser.java
index 622386ad67..868f620b7b 100644
--- a/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/asyncprofiler/JfrParser.java
+++ b/apm-agent-plugins/apm-profiling-plugin/src/main/java/co/elastic/apm/agent/profiler/asyncprofiler/JfrParser.java
@@ -25,8 +25,8 @@
import co.elastic.apm.agent.profiler.collections.Int2ObjectHashMap;
import co.elastic.apm.agent.profiler.collections.Long2LongHashMap;
import co.elastic.apm.agent.profiler.collections.Long2ObjectHashMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.io.File;
diff --git a/apm-agent-plugins/apm-profiling-plugin/src/test/java/co/elastic/apm/agent/profiler/SamplingProfilerReplay.java b/apm-agent-plugins/apm-profiling-plugin/src/test/java/co/elastic/apm/agent/profiler/SamplingProfilerReplay.java
index 48c63ebdbe..e213f316cc 100644
--- a/apm-agent-plugins/apm-profiling-plugin/src/test/java/co/elastic/apm/agent/profiler/SamplingProfilerReplay.java
+++ b/apm-agent-plugins/apm-profiling-plugin/src/test/java/co/elastic/apm/agent/profiler/SamplingProfilerReplay.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.MockReporter;
import co.elastic.apm.agent.MockTracer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.io.File;
import java.nio.file.Files;
diff --git a/apm-agent-plugins/apm-quartz-job-plugin/quartz-common/src/main/java/co/elastic/apm/agent/quartzjob/AbstractJobTransactionNameInstrumentation.java b/apm-agent-plugins/apm-quartz-job-plugin/quartz-common/src/main/java/co/elastic/apm/agent/quartzjob/AbstractJobTransactionNameInstrumentation.java
index 2cec263e3b..b9f4a6011b 100644
--- a/apm-agent-plugins/apm-quartz-job-plugin/quartz-common/src/main/java/co/elastic/apm/agent/quartzjob/AbstractJobTransactionNameInstrumentation.java
+++ b/apm-agent-plugins/apm-quartz-job-plugin/quartz-common/src/main/java/co/elastic/apm/agent/quartzjob/AbstractJobTransactionNameInstrumentation.java
@@ -31,8 +31,8 @@
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
import org.quartz.JobExecutionContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Collection;
diff --git a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-plugin/src/test/java/co/elastic/apm/agent/rabbitmq/RabbitMQIT.java b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-plugin/src/test/java/co/elastic/apm/agent/rabbitmq/RabbitMQIT.java
index 2c55a13e20..86588e5d5e 100644
--- a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-plugin/src/test/java/co/elastic/apm/agent/rabbitmq/RabbitMQIT.java
+++ b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-plugin/src/test/java/co/elastic/apm/agent/rabbitmq/RabbitMQIT.java
@@ -64,10 +64,9 @@
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.testcontainers.containers.RabbitMQContainer;
-import org.testcontainers.containers.output.Slf4jLogConsumer;
import javax.annotation.Nullable;
import java.io.IOException;
@@ -107,7 +106,7 @@ public class RabbitMQIT extends AbstractInstrumentationTest {
@BeforeAll
static void before() {
- container.withLogConsumer(new Slf4jLogConsumer(logger))
+ container.withLogConsumer(TestContainersUtils.createSlf4jLogConsumer(RabbitMQIT.class))
.withStartupTimeout(Duration.ofSeconds(120))
.withCreateContainerCmdModifier(TestContainersUtils.withMemoryLimit(2048))
.start();
diff --git a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchHelper.java b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchHelper.java
index 3bd18d49f7..80054e29f7 100644
--- a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchHelper.java
+++ b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchHelper.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.rabbitmq;
import co.elastic.apm.agent.impl.ElasticApmTracer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.amqp.core.Message;
import java.util.List;
diff --git a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchIteratorWrapper.java b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchIteratorWrapper.java
index ceedc5843a..2024261f07 100644
--- a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchIteratorWrapper.java
+++ b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/main/java/co/elastic/apm/agent/rabbitmq/MessageBatchIteratorWrapper.java
@@ -21,8 +21,8 @@
import co.elastic.apm.agent.impl.ElasticApmTracer;
import co.elastic.apm.agent.impl.transaction.Transaction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
diff --git a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/AbstractAsyncRabbitMqTest.java b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/AbstractAsyncRabbitMqTest.java
index cdebe8a3a5..66e68627b0 100644
--- a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/AbstractAsyncRabbitMqTest.java
+++ b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/AbstractAsyncRabbitMqTest.java
@@ -19,8 +19,8 @@
package co.elastic.apm.agent.rabbitmq;
import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.amqp.rabbit.AsyncRabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
diff --git a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/BatchConfiguration.java b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/BatchConfiguration.java
index d1d268b1c7..8d8db7c3a4 100644
--- a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/BatchConfiguration.java
+++ b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/BatchConfiguration.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.rabbitmq.TestConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
diff --git a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/MessageListenerConfiguration.java b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/MessageListenerConfiguration.java
index f5b3df602d..dfa34b2d11 100644
--- a/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/MessageListenerConfiguration.java
+++ b/apm-agent-plugins/apm-rabbitmq/apm-rabbitmq-spring/src/test/java/co/elastic/apm/agent/rabbitmq/config/MessageListenerConfiguration.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.rabbitmq.config;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.context.annotation.Bean;
diff --git a/apm-agent-plugins/apm-reactor-plugin/src/main/java/co/elastic/apm/agent/reactor/TracedSubscriber.java b/apm-agent-plugins/apm-reactor-plugin/src/main/java/co/elastic/apm/agent/reactor/TracedSubscriber.java
index 85d8af1a30..0b74598ef0 100644
--- a/apm-agent-plugins/apm-reactor-plugin/src/main/java/co/elastic/apm/agent/reactor/TracedSubscriber.java
+++ b/apm-agent-plugins/apm-reactor-plugin/src/main/java/co/elastic/apm/agent/reactor/TracedSubscriber.java
@@ -26,8 +26,8 @@
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import reactor.core.CoreSubscriber;
import reactor.core.Fuseable;
import reactor.core.publisher.Hooks;
diff --git a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce34StopSpanInstrumentation.java b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce34StopSpanInstrumentation.java
index b01a9f9c80..ddd989a354 100644
--- a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce34StopSpanInstrumentation.java
+++ b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce34StopSpanInstrumentation.java
@@ -25,8 +25,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Arrays;
import java.util.Collection;
diff --git a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce5StopSpanInstrumentation.java b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce5StopSpanInstrumentation.java
index b7cc382657..e2a49eb10c 100644
--- a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce5StopSpanInstrumentation.java
+++ b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/Lettuce5StopSpanInstrumentation.java
@@ -26,8 +26,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import java.util.Arrays;
import java.util.Collection;
diff --git a/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/ScheduledTransactionNameInstrumentation.java b/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/ScheduledTransactionNameInstrumentation.java
index ffca0e133f..46ac42aa66 100644
--- a/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/ScheduledTransactionNameInstrumentation.java
+++ b/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/ScheduledTransactionNameInstrumentation.java
@@ -31,8 +31,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Arrays;
diff --git a/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/TimerTaskInstrumentation.java b/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/TimerTaskInstrumentation.java
index 65c0254666..cbd78daa93 100644
--- a/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/TimerTaskInstrumentation.java
+++ b/apm-agent-plugins/apm-scheduled-annotation-plugin/src/main/java/co/elastic/apm/agent/scheduled/TimerTaskInstrumentation.java
@@ -30,8 +30,8 @@
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Arrays;
diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletTransactionHelper.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletTransactionHelper.java
index 7437b705c3..f32fa2ccc5 100644
--- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletTransactionHelper.java
+++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletTransactionHelper.java
@@ -29,8 +29,8 @@
import co.elastic.apm.agent.impl.transaction.Transaction;
import co.elastic.apm.agent.matcher.WildcardMatcher;
import co.elastic.apm.agent.util.TransactionNameUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Arrays;
diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletVersionInstrumentation.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletVersionInstrumentation.java
index 4dc981ccd4..3253aefee5 100644
--- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletVersionInstrumentation.java
+++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletVersionInstrumentation.java
@@ -23,8 +23,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/helper/ServletTransactionCreationHelper.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/helper/ServletTransactionCreationHelper.java
index f45a5ea85a..4b472b65be 100644
--- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/helper/ServletTransactionCreationHelper.java
+++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/helper/ServletTransactionCreationHelper.java
@@ -23,8 +23,8 @@
import co.elastic.apm.agent.impl.context.web.WebConfiguration;
import co.elastic.apm.agent.impl.transaction.Transaction;
import co.elastic.apm.agent.matcher.WildcardMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
diff --git a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java
index d237a99cf0..8b732ea584 100644
--- a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java
+++ b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java
@@ -24,8 +24,8 @@
import co.elastic.apm.agent.impl.transaction.Outcome;
import co.elastic.apm.agent.impl.transaction.Span;
import net.bytebuddy.asm.Advice;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpResponse;
diff --git a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/TransactionAwareSubscriber.java b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/TransactionAwareSubscriber.java
index efb362785a..826947df9d 100644
--- a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/TransactionAwareSubscriber.java
+++ b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/TransactionAwareSubscriber.java
@@ -24,8 +24,8 @@
import co.elastic.apm.agent.sdk.weakconcurrent.WeakMap;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.CoreSubscriber;
import reactor.util.context.Context;
diff --git a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxHelper.java b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxHelper.java
index ad6b000a1d..226d3c6d18 100644
--- a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxHelper.java
+++ b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxHelper.java
@@ -31,8 +31,8 @@
import co.elastic.apm.agent.util.PotentiallyMultiValuedMap;
import co.elastic.apm.agent.util.TransactionNameUtils;
import org.reactivestreams.Publisher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
diff --git a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxServletHelper.java b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxServletHelper.java
index 4df4205d06..e114262d70 100644
--- a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxServletHelper.java
+++ b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-plugin/src/main/java/co/elastic/apm/agent/springwebflux/WebfluxServletHelper.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.cache.WeakKeySoftValueLoadingCache;
import co.elastic.apm.agent.impl.transaction.Transaction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
diff --git a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/GreetingAnnotated.java b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/GreetingAnnotated.java
index 2610ce3398..6c37dc8aa3 100644
--- a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/GreetingAnnotated.java
+++ b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/GreetingAnnotated.java
@@ -22,8 +22,8 @@
import co.elastic.apm.agent.impl.GlobalTracer;
import co.elastic.apm.agent.impl.transaction.AbstractSpan;
import co.elastic.apm.agent.impl.transaction.Transaction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
diff --git a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/WebFluxApplication.java b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/WebFluxApplication.java
index df713618d4..457b043346 100644
--- a/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/WebFluxApplication.java
+++ b/apm-agent-plugins/apm-spring-webflux/apm-spring-webflux-testapp/src/main/java/co/elastic/apm/agent/springwebflux/testapp/WebFluxApplication.java
@@ -18,8 +18,8 @@
*/
package co.elastic.apm.agent.springwebflux.testapp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java
index 4da01ba2af..1a5d83de73 100644
--- a/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java
+++ b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java
@@ -24,8 +24,8 @@
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;
import javax.servlet.ServletContext;
diff --git a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPropertyAccessor.java b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPropertyAccessor.java
index 5bb48dfc73..16ce3bbd74 100644
--- a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPropertyAccessor.java
+++ b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPropertyAccessor.java
@@ -20,8 +20,8 @@
import co.elastic.apm.agent.impl.transaction.TextHeaderGetter;
import co.elastic.apm.agent.impl.transaction.TextHeaderSetter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.net.HttpURLConnection;
diff --git a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractHttpTransactionHelper.java b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractHttpTransactionHelper.java
index ea75657e2b..e67d771710 100644
--- a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractHttpTransactionHelper.java
+++ b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractHttpTransactionHelper.java
@@ -27,8 +27,8 @@
import co.elastic.apm.agent.impl.transaction.Transaction;
import co.elastic.apm.agent.matcher.WildcardMatcher;
import co.elastic.apm.agent.util.TransactionNameUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Arrays;
diff --git a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebHelper.java b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebHelper.java
index 957821b0d0..ffaefad272 100644
--- a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebHelper.java
+++ b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebHelper.java
@@ -33,8 +33,8 @@
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.ext.web.RoutingContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.nio.CharBuffer;
diff --git a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/test/java/co/elastic/apm/agent/vertx/helper/VertxTestHttpServer.java b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/test/java/co/elastic/apm/agent/vertx/helper/VertxTestHttpServer.java
index 246ddd3150..510ed53ff9 100644
--- a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/test/java/co/elastic/apm/agent/vertx/helper/VertxTestHttpServer.java
+++ b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/test/java/co/elastic/apm/agent/vertx/helper/VertxTestHttpServer.java
@@ -25,8 +25,8 @@
import io.vertx.core.net.PemKeyCertOptions;
import io.vertx.ext.web.Router;
import io.vertx.junit5.VertxTestContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import javax.annotation.Nullable;
import java.util.Objects;
diff --git a/apm-agent/pom.xml b/apm-agent/pom.xml
index d043e64fcd..6c35eb77f6 100644
--- a/apm-agent/pom.xml
+++ b/apm-agent/pom.xml
@@ -24,11 +24,6 @@
-
- org.slf4j
- jul-to-slf4j
- ${version.slf4j}
-
${project.groupId}
apm-agent-core
diff --git a/integration-tests/application-server-integration-tests/src/test/java/co/elastic/apm/servlet/AbstractServletContainerIntegrationTest.java b/integration-tests/application-server-integration-tests/src/test/java/co/elastic/apm/servlet/AbstractServletContainerIntegrationTest.java
index 5239766e75..c197e13192 100644
--- a/integration-tests/application-server-integration-tests/src/test/java/co/elastic/apm/servlet/AbstractServletContainerIntegrationTest.java
+++ b/integration-tests/application-server-integration-tests/src/test/java/co/elastic/apm/servlet/AbstractServletContainerIntegrationTest.java
@@ -35,8 +35,8 @@
import org.mockserver.model.ClearType;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import co.elastic.apm.agent.sdk.logging.Logger;
+import co.elastic.apm.agent.sdk.logging.LoggerFactory;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.Network;
@@ -102,7 +102,7 @@ public abstract class AbstractServletContainerIntegrationTest {
private static final String AGENT_VERSION_TO_DOWNLOAD_FROM_MAVEN = null;
private static MockServerContainer mockServerContainer = new MockServerContainer()
- //.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger(MockServerContainer.class)))
+ .withLogConsumer(TestContainersUtils.createSlf4jLogConsumer(MockServerContainer.class))
.withNetworkAliases("apm-server")
.withNetwork(Network.SHARED);
private static OkHttpClient httpClient;