26
26
package com .xpdustry .slf4md .simple ;
27
27
28
28
import arc .util .serialization .Json ;
29
- import java .util .Arrays ;
30
29
import java .util .List ;
31
30
import java .util .Map ;
32
31
import java .util .concurrent .ConcurrentHashMap ;
36
35
import org .checkerframework .checker .nullness .qual .Nullable ;
37
36
import org .slf4j .ILoggerFactory ;
38
37
import org .slf4j .Logger ;
38
+ import org .slf4j .LoggerFactory ;
39
39
40
40
public final class SimpleLoggerFactory implements ILoggerFactory {
41
41
42
42
private static final List <String > LOGGING_PACKAGES = List .of ("org.slf4j" , "java.util.logging" , "sun.util.logging" );
43
43
44
+ private static final List <Class <?>> LOGGING_CLASSES = List .of (SimpleLoggerFactory .class , LoggerFactory .class );
45
+
44
46
private final Map <String , SimpleLogger > loggers = new ConcurrentHashMap <>();
45
47
46
48
{
@@ -58,17 +60,17 @@ public Logger getLogger(final String name) {
58
60
59
61
try {
60
62
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 ()) {
70
70
return new SimpleLogger (name , null );
71
71
}
72
+ cache = false ;
73
+ caller = candidate .get ();
72
74
}
73
75
74
76
if (Plugin .class .isAssignableFrom (caller )) {
@@ -102,16 +104,6 @@ public Logger getLogger(final String name) {
102
104
return logger ;
103
105
}
104
106
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
-
115
107
private @ Nullable String getPluginDisplayName (final ClassLoader loader ) {
116
108
var resource = loader .getResourceAsStream ("plugin.json" );
117
109
if (resource == null ) {
0 commit comments