diff --git a/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts b/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts index 8d1f7ea591dd..bb721e9e365d 100644 --- a/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts +++ b/instrumentation/logback/logback-appender-1.0/library/build.gradle.kts @@ -100,6 +100,30 @@ testing { } } } + + val asyncAppenderTest by registering(JvmTestSuite::class) { + dependencies { + implementation(project(":instrumentation:logback:logback-appender-1.0:library")) + implementation("io.opentelemetry:opentelemetry-sdk-testing") + implementation(project(":testing-common")) + + if (latestDepTest) { + implementation("ch.qos.logback:logback-classic:+") + } else { + implementation("ch.qos.logback:logback-classic") { + version { + // first version that has ch.qos.logback.classic.AsyncAppender + strictly("1.0.4") + } + } + implementation("org.slf4j:slf4j-api") { + version { + strictly("1.6.4") + } + } + } + } + } } } diff --git a/instrumentation/logback/logback-appender-1.0/library/src/asyncAppenderTest/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AsyncOpenTelemetryAppenderTest.java b/instrumentation/logback/logback-appender-1.0/library/src/asyncAppenderTest/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AsyncOpenTelemetryAppenderTest.java new file mode 100644 index 000000000000..9ca5aeae3131 --- /dev/null +++ b/instrumentation/logback/logback-appender-1.0/library/src/asyncAppenderTest/java/io/opentelemetry/instrumentation/logback/appender/v1_0/AsyncOpenTelemetryAppenderTest.java @@ -0,0 +1,33 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.logback.appender.v1_0; + +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class AsyncOpenTelemetryAppenderTest { + private static final Logger logger = LoggerFactory.getLogger("TestLogger"); + + @RegisterExtension + private static final LibraryInstrumentationExtension testing = + LibraryInstrumentationExtension.create(); + + @BeforeEach + void setup() { + OpenTelemetryAppender.install(testing.getOpenTelemetry()); + } + + @Test + void captureLogMessage() { + logger.info("log message 1"); + + testing.waitAndAssertLogRecords(logRecord -> logRecord.hasBody("log message 1")); + } +} diff --git a/instrumentation/logback/logback-appender-1.0/library/src/asyncAppenderTest/resources/logback-test.xml b/instrumentation/logback/logback-appender-1.0/library/src/asyncAppenderTest/resources/logback-test.xml new file mode 100644 index 000000000000..3781fe0f2024 --- /dev/null +++ b/instrumentation/logback/logback-appender-1.0/library/src/asyncAppenderTest/resources/logback-test.xml @@ -0,0 +1,24 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java index 3a96bc7b5814..ede0a1ebe010 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java @@ -9,7 +9,9 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; import ch.qos.logback.core.UnsynchronizedAppenderBase; +import ch.qos.logback.core.spi.AppenderAttachable; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper; import java.util.ArrayList; @@ -60,14 +62,17 @@ public static void install(OpenTelemetry openTelemetry) { } LoggerContext loggerContext = (LoggerContext) loggerFactorySpi; for (ch.qos.logback.classic.Logger logger : loggerContext.getLoggerList()) { - logger + logger.iteratorForAppenders().forEachRemaining(appender -> install(openTelemetry, appender)); + } + } + + private static void install(OpenTelemetry openTelemetry, Appender appender) { + if (appender instanceof OpenTelemetryAppender) { + ((OpenTelemetryAppender) appender).setOpenTelemetry(openTelemetry); + } else if (appender instanceof AppenderAttachable) { + ((AppenderAttachable) appender) .iteratorForAppenders() - .forEachRemaining( - appender -> { - if (appender instanceof OpenTelemetryAppender) { - ((OpenTelemetryAppender) appender).setOpenTelemetry(openTelemetry); - } - }); + .forEachRemaining(a -> OpenTelemetryAppender.install(openTelemetry, a)); } }