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 @@
+