Skip to content

Commit fd4984b

Browse files
committed
Prevent crashes when 3rd party loggers do not implement setLevel (#8631)
Suppressed IDE stack trace for setLevel failure using reflection check, and optimized with caching to avoid performance overhead.
1 parent 6382f0e commit fd4984b

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

src/io/flutter/logging/PluginLogger.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,32 @@ public class PluginLogger {
4646
public static void updateLogLevel() {
4747
final Logger rootLoggerInstance = Logger.getInstance("io.flutter");
4848
try {
49-
rootLoggerInstance.setLevel(FlutterSettings.getInstance().isVerboseLogging() ? LogLevel.ALL : LogLevel.INFO);
49+
if (isSetLevelOverridden(rootLoggerInstance)) {
50+
rootLoggerInstance.setLevel(FlutterSettings.getInstance().isVerboseLogging() ? LogLevel.ALL : LogLevel.INFO);
51+
}
5052
}
5153
catch (Throwable e) {
52-
// This can happen if the logger is wrapped by a 3rd party plugin that doesn't correctly implement setLevel.
53-
// See https://github.com/flutter/flutter-intellij/issues/8631
54-
Logger.getInstance(PluginLogger.class).warn("Failed to set log level", e);
54+
// This helper method via reflection should prevent the call to setLevel if it's not overridden,
55+
// but we keep this catch block as a final safety net.
5556
}
5657
}
5758

59+
private static Boolean isSetLevelOverridden;
60+
61+
private static boolean isSetLevelOverridden(Logger logger) {
62+
if (isSetLevelOverridden != null) {
63+
return isSetLevelOverridden;
64+
}
65+
try {
66+
final java.lang.reflect.Method method = logger.getClass().getMethod("setLevel", LogLevel.class);
67+
isSetLevelOverridden = !method.getDeclaringClass().equals(Logger.class);
68+
}
69+
catch (NoSuchMethodException | SecurityException e) {
70+
isSetLevelOverridden = false;
71+
}
72+
return isSetLevelOverridden;
73+
}
74+
5875
public static @NotNull Logger createLogger(@NotNull Class<?> logClass) {
5976
return Logger.getInstance(logClass.getName());
6077
}

0 commit comments

Comments
 (0)