Skip to content

Commit b46cbff

Browse files
committed
use reflection
1 parent 164f194 commit b46cbff

File tree

2 files changed

+47
-4
lines changed
  • instrumentation/log4j/log4j-appender-2.17/javaagent

2 files changed

+47
-4
lines changed

instrumentation/log4j/log4j-appender-2.17/javaagent/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ muzzle {
1414
val testLatestDeps = findProperty("testLatestDeps") as Boolean
1515

1616
dependencies {
17-
library("org.apache.logging.log4j:log4j-core:2.17.0")
17+
library("org.apache.logging.log4j:log4j-core:2.0")
1818

1919
compileOnly(project(":javaagent-bootstrap"))
2020

instrumentation/log4j/log4j-appender-2.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v2_17/Log4jHelper.java

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.ContextDataAccessor;
1515
import io.opentelemetry.instrumentation.log4j.appender.v2_17.internal.LogEventMapper;
1616
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
17+
import java.lang.invoke.MethodHandle;
18+
import java.lang.invoke.MethodHandles;
19+
import java.lang.invoke.MethodType;
1720
import java.time.Instant;
1821
import java.util.List;
1922
import java.util.Map;
@@ -24,13 +27,12 @@
2427
import org.apache.logging.log4j.Marker;
2528
import org.apache.logging.log4j.ThreadContext;
2629
import org.apache.logging.log4j.message.Message;
27-
import org.apache.logging.log4j.util.StackLocator;
2830

2931
public final class Log4jHelper {
3032

3133
private static final LogEventMapper<Map<String, String>> mapper;
32-
3334
private static final boolean captureExperimentalAttributes;
35+
private static final MethodHandle stackTraceMethodHandle = getStackTraceMethodHandle();
3436

3537
static {
3638
InstrumentationConfig config = AgentInstrumentationConfig.get();
@@ -98,12 +100,53 @@ public static void capture(
98100
threadName,
99101
threadId,
100102
() ->
101-
location != null ? location : StackLocator.getInstance().calcLocation(loggerClassName),
103+
location != null ? location : getLocation(loggerClassName),
102104
Context.current());
103105
builder.setTimestamp(Instant.now());
104106
builder.emit();
105107
}
106108

109+
private static StackTraceElement getLocation(String loggerClassName) {
110+
if (stackTraceMethodHandle == null) {
111+
return null;
112+
}
113+
114+
try {
115+
return (StackTraceElement) stackTraceMethodHandle.invoke(loggerClassName);
116+
} catch (Throwable exception) {
117+
return null;
118+
}
119+
}
120+
121+
private static MethodHandle getStackTraceMethodHandle() {
122+
// since 2.9.0
123+
Class<?> stackTraceClass = null;
124+
try {
125+
stackTraceClass = Class.forName("org.apache.logging.log4j.util.StackLocatorUtil");
126+
} catch (ClassNotFoundException exception) {
127+
// ignore
128+
}
129+
if (stackTraceClass == null) {
130+
try {
131+
stackTraceClass = Class.forName("org.apache.logging.log4j.core.impl.Log4jLogEvent");
132+
} catch (ClassNotFoundException exception) {
133+
// ignore
134+
}
135+
}
136+
if (stackTraceClass == null) {
137+
return null;
138+
}
139+
try {
140+
return MethodHandles.lookup()
141+
.findStatic(
142+
stackTraceClass,
143+
"calcLocation",
144+
MethodType.methodType(StackTraceElement.class, String.class));
145+
} catch (Exception exception) {
146+
return null;
147+
}
148+
}
149+
107150
private enum ContextDataAccessorImpl implements ContextDataAccessor<Map<String, String>> {
108151
INSTANCE;
109152

0 commit comments

Comments
 (0)