diff --git a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java index b9057aa31be8e98b9db082be4eadad91720788d7..d77e6416cf03278844fb84c3d68cde212266370b 100644 --- a/jadx-gui/src/main/java/jadx/gui/JadxGUI.java +++ b/jadx-gui/src/main/java/jadx/gui/JadxGUI.java @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory; import jadx.gui.settings.JadxSettings; import jadx.gui.settings.JadxSettingsAdapter; import jadx.gui.ui.MainWindow; -import jadx.gui.utils.LogCollector; +import jadx.gui.utils.logs.LogCollector; public class JadxGUI { private static final Logger LOG = LoggerFactory.getLogger(JadxGUI.class); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/LogViewer.java b/jadx-gui/src/main/java/jadx/gui/ui/LogViewer.java index fd136b01d852d6375631064406fd6a6b5b356b3e..ee6d3fb4bde245428bad5b1797940664f6ba7248 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/LogViewer.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/LogViewer.java @@ -7,8 +7,9 @@ import ch.qos.logback.classic.Level; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import jadx.gui.settings.JadxSettings; -import jadx.gui.utils.LogCollector; import jadx.gui.utils.NLS; +import jadx.gui.utils.logs.ILogListener; +import jadx.gui.utils.logs.LogCollector; class LogViewer extends JDialog { private static final long serialVersionUID = -2188700277429054641L; @@ -67,7 +68,7 @@ class LogViewer extends JDialog { LogCollector logCollector = LogCollector.getInstance(); logCollector.resetListener(); textPane.setText(""); - logCollector.registerListener(new LogCollector.ILogListener() { + logCollector.registerListener(new ILogListener() { @Override public Level getFilterLevel() { return level; @@ -75,10 +76,7 @@ class LogViewer extends JDialog { @Override public void onAppend(final String logStr) { - SwingUtilities.invokeLater(() -> { - textPane.append(logStr); - textPane.updateUI(); - }); + SwingUtilities.invokeLater(() -> textPane.append(logStr)); } }); } diff --git a/jadx-gui/src/main/java/jadx/gui/utils/logs/ILogListener.java b/jadx-gui/src/main/java/jadx/gui/utils/logs/ILogListener.java new file mode 100644 index 0000000000000000000000000000000000000000..c4dd8c825a765412aee35595b240e65492a7eb2d --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/logs/ILogListener.java @@ -0,0 +1,9 @@ +package jadx.gui.utils.logs; + +import ch.qos.logback.classic.Level; + +public interface ILogListener { + Level getFilterLevel(); + + void onAppend(String logStr); +} diff --git a/jadx-gui/src/main/java/jadx/gui/utils/LogCollector.java b/jadx-gui/src/main/java/jadx/gui/utils/logs/LogCollector.java similarity index 60% rename from jadx-gui/src/main/java/jadx/gui/utils/LogCollector.java rename to jadx-gui/src/main/java/jadx/gui/utils/logs/LogCollector.java index 7604b02f12a679b3d39468f7a305c99e996d776e..a7f2fc9029fd97108a4c2b1308f6f4e22a709e23 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/LogCollector.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/logs/LogCollector.java @@ -1,21 +1,25 @@ -package jadx.gui.utils; +package jadx.gui.utils.logs; + +import java.util.Deque; +import java.util.LinkedList; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.PatternLayout; import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; import ch.qos.logback.core.Layout; -import ch.qos.logback.core.read.CyclicBufferAppender; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.LoggerFactory; -public class LogCollector extends CyclicBufferAppender { - private static LogCollector instance = new LogCollector(); +public class LogCollector extends AppenderBase { + public static final int BUFFER_SIZE = 5000; + private static final LogCollector INSTANCE = new LogCollector(); public static LogCollector getInstance() { - return instance; + return INSTANCE; } public static void register() { @@ -27,18 +31,11 @@ public class LogCollector extends CyclicBufferAppender { layout.setPattern("%-5level: %msg%n"); layout.start(); - instance.setContext(loggerContext); - instance.setLayout(layout); - instance.start(); - - rootLogger.addAppender(instance); - } - - public interface ILogListener { - - Level getFilterLevel(); + INSTANCE.setContext(loggerContext); + INSTANCE.setLayout(layout); + INSTANCE.start(); - void onAppend(String logStr); + rootLogger.addAppender(INSTANCE); } private Layout layout; @@ -46,22 +43,31 @@ public class LogCollector extends CyclicBufferAppender { @Nullable private ILogListener listener; + private final Deque buffer = new LinkedList<>(); + public LogCollector() { setName("LogCollector"); - setMaxSize(5000); } @Override protected void append(ILoggingEvent event) { - super.append(event); - if (listener != null - && event.getLevel().isGreaterOrEqual(listener.getFilterLevel())) { - synchronized (this) { - listener.onAppend(layout.doLayout(event)); + synchronized (this) { + Level level = event.getLevel(); + String msg = layout.doLayout(event); + store(level, msg); + if (listener != null && level.isGreaterOrEqual(listener.getFilterLevel())) { + listener.onAppend(msg); } } } + private void store(Level level, String msg) { + buffer.addLast(new LogEvent(level, msg)); + if (buffer.size() > BUFFER_SIZE) { + buffer.pollFirst(); + } + } + public void setLayout(Layout layout) { this.layout = layout; } @@ -79,11 +85,9 @@ public class LogCollector extends CyclicBufferAppender { private String init(Level filterLevel) { StringBuilder sb = new StringBuilder(); - int length = getLength(); - for (int i = 0; i < length; i++) { - ILoggingEvent event = get(i); + for (LogEvent event : buffer) { if (event.getLevel().isGreaterOrEqual(filterLevel)) { - sb.append(layout.doLayout(event)); + sb.append(event.getMsg()); } } return sb.toString(); diff --git a/jadx-gui/src/main/java/jadx/gui/utils/logs/LogEvent.java b/jadx-gui/src/main/java/jadx/gui/utils/logs/LogEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..44b591c900eba7b03d15e593bd80a2911418adb3 --- /dev/null +++ b/jadx-gui/src/main/java/jadx/gui/utils/logs/LogEvent.java @@ -0,0 +1,26 @@ +package jadx.gui.utils.logs; + +import ch.qos.logback.classic.Level; + +final class LogEvent { + private final Level level; + private final String msg; + + LogEvent(Level level, String msg) { + this.level = level; + this.msg = msg; + } + + public Level getLevel() { + return level; + } + + public String getMsg() { + return msg; + } + + @Override + public String toString() { + return level + ": " + msg; + } +}