Skip to content

Commit 0314edb

Browse files
committed
perf: Better logger caller lookup
1 parent dd2a60a commit 0314edb

File tree

1 file changed

+12
-20
lines changed

1 file changed

+12
-20
lines changed

slf4md-simple/src/main/java/com/xpdustry/slf4md/simple/SimpleLoggerFactory.java

+12-20
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
package com.xpdustry.slf4md.simple;
2727

2828
import arc.util.serialization.Json;
29-
import java.util.Arrays;
3029
import java.util.List;
3130
import java.util.Map;
3231
import java.util.concurrent.ConcurrentHashMap;
@@ -36,11 +35,14 @@
3635
import org.checkerframework.checker.nullness.qual.Nullable;
3736
import org.slf4j.ILoggerFactory;
3837
import org.slf4j.Logger;
38+
import org.slf4j.LoggerFactory;
3939

4040
public final class SimpleLoggerFactory implements ILoggerFactory {
4141

4242
private static final List<String> LOGGING_PACKAGES = List.of("org.slf4j", "java.util.logging", "sun.util.logging");
4343

44+
private static final List<Class<?>> LOGGING_CLASSES = List.of(SimpleLoggerFactory.class, LoggerFactory.class);
45+
4446
private final Map<String, SimpleLogger> loggers = new ConcurrentHashMap<>();
4547

4648
{
@@ -58,17 +60,17 @@ public Logger getLogger(final String name) {
5860

5961
try {
6062
caller = Class.forName(name);
61-
} catch (final ClassNotFoundException ignored1) {
62-
final var candidate = tryFindCaller(Thread.currentThread().getStackTrace());
63-
if (candidate == null) {
64-
return new SimpleLogger(name, null);
65-
}
66-
try {
67-
caller = Class.forName(candidate);
68-
cache = false;
69-
} catch (final ClassNotFoundException ignored2) {
63+
} catch (final ClassNotFoundException ignored) {
64+
final var candidate = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
65+
.walk(stream -> stream.map(StackWalker.StackFrame::getDeclaringClass)
66+
.dropWhile(clazz -> LOGGING_CLASSES.stream().noneMatch(skip -> skip.isAssignableFrom(clazz))
67+
|| LOGGING_PACKAGES.stream().anyMatch(clazz.getPackageName()::startsWith))
68+
.findFirst());
69+
if (candidate.isEmpty()) {
7070
return new SimpleLogger(name, null);
7171
}
72+
cache = false;
73+
caller = candidate.get();
7274
}
7375

7476
if (Plugin.class.isAssignableFrom(caller)) {
@@ -102,16 +104,6 @@ public Logger getLogger(final String name) {
102104
return logger;
103105
}
104106

105-
private @Nullable String tryFindCaller(final StackTraceElement[] stacktrace) {
106-
return Arrays.stream(stacktrace)
107-
.skip(3) // 0: stacktrace call, 1: DistributorLoggerFactory#getLogger, 2: LoggerFactory#getLogger
108-
.map(StackTraceElement::getClassName)
109-
// Skips the logger wrappers
110-
.dropWhile(clazz -> LOGGING_PACKAGES.stream().anyMatch(clazz::startsWith))
111-
.findFirst()
112-
.orElse(null);
113-
}
114-
115107
private @Nullable String getPluginDisplayName(final ClassLoader loader) {
116108
var resource = loader.getResourceAsStream("plugin.json");
117109
if (resource == null) {

0 commit comments

Comments
 (0)