From 2126b61e99972d6572ed2613f4647cffc06d7201 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sun, 9 Aug 2020 18:29:04 +0200 Subject: [PATCH] Add logging tab --- CHANGELOG.md | 5 + client/pom.xml | 2 +- .../java/ctbrec/ui/CamrecApplication.java | 2 + .../ui/tabs/logging/CtbrecAppender.java | 13 ++ .../ctbrec/ui/tabs/logging/LoggingTab.java | 120 ++++++++++++++++++ client/src/main/resources/logback.xml | 7 + 6 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 client/src/main/java/ctbrec/ui/tabs/logging/CtbrecAppender.java create mode 100644 client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 8af54f2d..70fd84bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +3.8.6 +======================== +* Added setting to disable the online check for paused models +* Added tab which shows the log output + 3.8.5 ======================== * Fixed Stripchat followed tab. It didn't work, if you have many favorited diff --git a/client/pom.xml b/client/pom.xml index 44e39450..7becf27d 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -71,7 +71,7 @@ ch.qos.logback logback-classic - runtime + compile org.openjfx diff --git a/client/src/main/java/ctbrec/ui/CamrecApplication.java b/client/src/main/java/ctbrec/ui/CamrecApplication.java index 29469fb1..5ccb8fb6 100644 --- a/client/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/client/src/main/java/ctbrec/ui/CamrecApplication.java @@ -61,6 +61,7 @@ import ctbrec.ui.tabs.RecordingsTab; import ctbrec.ui.tabs.SiteTab; import ctbrec.ui.tabs.TabSelectionListener; import ctbrec.ui.tabs.UpdateTab; +import ctbrec.ui.tabs.logging.LoggingTab; import javafx.application.Application; import javafx.application.HostServices; import javafx.application.Platform; @@ -191,6 +192,7 @@ public class CamrecApplication extends Application { tabPane.getTabs().add(new NewsTab()); tabPane.getTabs().add(new DonateTabFx()); tabPane.getTabs().add(new HelpTab()); + tabPane.getTabs().add(new LoggingTab()); switchToStartTab(); writeColorSchemeStyleSheet(); diff --git a/client/src/main/java/ctbrec/ui/tabs/logging/CtbrecAppender.java b/client/src/main/java/ctbrec/ui/tabs/logging/CtbrecAppender.java new file mode 100644 index 00000000..14ff5b9e --- /dev/null +++ b/client/src/main/java/ctbrec/ui/tabs/logging/CtbrecAppender.java @@ -0,0 +1,13 @@ +package ctbrec.ui.tabs.logging; + +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.ConsoleAppender; +import ctbrec.event.EventBusHolder; + +public class CtbrecAppender extends ConsoleAppender { + + @Override + protected void append(LoggingEvent event) { + EventBusHolder.BUS.post(event); + } +} diff --git a/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java b/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java new file mode 100644 index 00000000..dc3a4c01 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java @@ -0,0 +1,120 @@ +package ctbrec.ui.tabs.logging; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.LinkedList; +import java.util.stream.Collectors; + +import com.google.common.eventbus.Subscribe; + +import ch.qos.logback.classic.spi.IThrowableProxy; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.spi.StackTraceElementProxy; +import ctbrec.event.EventBusHolder; +import ctbrec.ui.controls.SearchBox; +import javafx.application.Platform; +import javafx.beans.property.SimpleStringProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.Insets; +import javafx.scene.control.Tab; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.layout.BorderPane; + +public class LoggingTab extends Tab { + + private static final int HISTORY_LENGTH = 10_000; + private SearchBox filter = new SearchBox(); + private TableView table = new TableView<>(); + private ObservableList history = FXCollections.observableList(Collections.synchronizedList(new LinkedList<>())); + private ObservableList filteredEvents = FXCollections.observableArrayList(); + private DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + private volatile boolean tabClosed = false; + private Object eventBustSubscriber = new Object() { + @Subscribe + public void publishLoggingEevent(LoggingEvent event) { + if (!tabClosed) { + Platform.runLater(() -> { + history.add(event); + if (history.size() > HISTORY_LENGTH - 1) { + history.remove(0); + } + filter(); + }); + } + } + }; + + private void filter() { + filteredEvents.clear(); + filteredEvents.addAll(history.stream().filter(evt -> { + String q = filter.getText().toLowerCase(); + return evt.getLevel().toString().toLowerCase().contains(q) + || createLogMessage(evt).toLowerCase().contains(q); + }).collect(Collectors.toList())); + } + + public LoggingTab() { + setText("Logging"); + subscribeToEventBus(); + + table = new TableView<>(filteredEvents); + + int idx = 0; + TableColumn level = createTableColumn("Level", 65, idx++); + level.setCellValueFactory(cdf -> new SimpleStringProperty(cdf.getValue().getLevel().toString())); + table.getColumns().add(level); + + TableColumn time = createTableColumn("Timestamp", 200, idx++); + time.setCellValueFactory(cdf -> { + Instant instant = Instant.ofEpochMilli(cdf.getValue().getTimeStamp()); + return new SimpleStringProperty(instant.atZone(ZoneId.systemDefault()).format(timeFormatter)); + }); + table.getColumns().add(time); + + TableColumn msg = createTableColumn("Message", 2000, idx++); + msg.setCellValueFactory(cdf -> new SimpleStringProperty(createLogMessage(cdf.getValue()))); + table.getColumns().add(msg); + + BorderPane layout = new BorderPane(); + BorderPane.setMargin(table, new Insets(10)); + BorderPane.setMargin(filter, new Insets(10, 10, 0, 10)); + layout.setCenter(table); + layout.setTop(filter); + + setContent(layout); + setOnClosed(evt -> { + EventBusHolder.BUS.unregister(eventBustSubscriber); + tabClosed = true; + }); + + filter.setPromptText("Search"); + filter.textProperty().addListener( (observableValue, oldValue, newValue) -> filter()); + } + + private String createLogMessage(LoggingEvent evt) { + StringBuilder sb = new StringBuilder(evt.getFormattedMessage()); + if(evt.getThrowableProxy() != null) { + IThrowableProxy throwableProxy = evt.getThrowableProxy(); + sb.append('\n').append(throwableProxy.getClassName()).append(':').append(' ').append(throwableProxy.getMessage()); + for (StackTraceElementProxy step : throwableProxy.getStackTraceElementProxyArray()) { + sb.append('\n').append('\t').append(step.getSTEAsString()); + } + } + return sb.toString(); + } + + private TableColumn createTableColumn(String text, int width, int idx) { + TableColumn tc = new TableColumn<>(text); + tc.setPrefWidth(width); + tc.setUserData(idx); + return tc; + } + + private void subscribeToEventBus() { + EventBusHolder.BUS.register(eventBustSubscriber); + } +} diff --git a/client/src/main/resources/logback.xml b/client/src/main/resources/logback.xml index 6aa57c26..e9ef55dd 100644 --- a/client/src/main/resources/logback.xml +++ b/client/src/main/resources/logback.xml @@ -8,6 +8,12 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + @@ -32,6 +38,7 @@ +