Skip to content

Commit 2da1d1f

Browse files
authored
Logback: fix otel appender install for async appenders (#13047)
1 parent ebdd5af commit 2da1d1f

File tree

4 files changed

+93
-7
lines changed

4 files changed

+93
-7
lines changed

instrumentation/logback/logback-appender-1.0/library/build.gradle.kts

+24
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,30 @@ testing {
100100
}
101101
}
102102
}
103+
104+
val asyncAppenderTest by registering(JvmTestSuite::class) {
105+
dependencies {
106+
implementation(project(":instrumentation:logback:logback-appender-1.0:library"))
107+
implementation("io.opentelemetry:opentelemetry-sdk-testing")
108+
implementation(project(":testing-common"))
109+
110+
if (latestDepTest) {
111+
implementation("ch.qos.logback:logback-classic:+")
112+
} else {
113+
implementation("ch.qos.logback:logback-classic") {
114+
version {
115+
// first version that has ch.qos.logback.classic.AsyncAppender
116+
strictly("1.0.4")
117+
}
118+
}
119+
implementation("org.slf4j:slf4j-api") {
120+
version {
121+
strictly("1.6.4")
122+
}
123+
}
124+
}
125+
}
126+
}
103127
}
104128
}
105129

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.logback.appender.v1_0;
7+
8+
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
14+
15+
class AsyncOpenTelemetryAppenderTest {
16+
private static final Logger logger = LoggerFactory.getLogger("TestLogger");
17+
18+
@RegisterExtension
19+
private static final LibraryInstrumentationExtension testing =
20+
LibraryInstrumentationExtension.create();
21+
22+
@BeforeEach
23+
void setup() {
24+
OpenTelemetryAppender.install(testing.getOpenTelemetry());
25+
}
26+
27+
@Test
28+
void captureLogMessage() {
29+
logger.info("log message 1");
30+
31+
testing.waitAndAssertLogRecords(logRecord -> logRecord.hasBody("log message 1"));
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration>
3+
4+
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
5+
<encoder>
6+
<pattern>
7+
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
8+
</pattern>
9+
</encoder>
10+
</appender>
11+
<appender name="OpenTelemetry"
12+
class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
13+
</appender>
14+
15+
<appender name="AsyncAppender" class="ch.qos.logback.classic.AsyncAppender">
16+
<appender-ref ref="OpenTelemetry" />
17+
</appender>
18+
19+
<root level="INFO">
20+
<appender-ref ref="console"/>
21+
<appender-ref ref="AsyncAppender"/>
22+
</root>
23+
24+
</configuration>

instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/OpenTelemetryAppender.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99

1010
import ch.qos.logback.classic.LoggerContext;
1111
import ch.qos.logback.classic.spi.ILoggingEvent;
12+
import ch.qos.logback.core.Appender;
1213
import ch.qos.logback.core.UnsynchronizedAppenderBase;
14+
import ch.qos.logback.core.spi.AppenderAttachable;
1315
import io.opentelemetry.api.OpenTelemetry;
1416
import io.opentelemetry.instrumentation.logback.appender.v1_0.internal.LoggingEventMapper;
1517
import java.util.ArrayList;
@@ -60,14 +62,17 @@ public static void install(OpenTelemetry openTelemetry) {
6062
}
6163
LoggerContext loggerContext = (LoggerContext) loggerFactorySpi;
6264
for (ch.qos.logback.classic.Logger logger : loggerContext.getLoggerList()) {
63-
logger
65+
logger.iteratorForAppenders().forEachRemaining(appender -> install(openTelemetry, appender));
66+
}
67+
}
68+
69+
private static void install(OpenTelemetry openTelemetry, Appender<?> appender) {
70+
if (appender instanceof OpenTelemetryAppender) {
71+
((OpenTelemetryAppender) appender).setOpenTelemetry(openTelemetry);
72+
} else if (appender instanceof AppenderAttachable) {
73+
((AppenderAttachable<?>) appender)
6474
.iteratorForAppenders()
65-
.forEachRemaining(
66-
appender -> {
67-
if (appender instanceof OpenTelemetryAppender) {
68-
((OpenTelemetryAppender) appender).setOpenTelemetry(openTelemetry);
69-
}
70-
});
75+
.forEachRemaining(a -> OpenTelemetryAppender.install(openTelemetry, a));
7176
}
7277
}
7378

0 commit comments

Comments
 (0)