Перенаправить логи в JavaFX TextArea
Есть десктопное приложение, написанное на JavaFX (UI) и Spring Boot. Связка выполнена с помощью FxWeaver. Нужно сделать следующее: на форме есть TextArea, предназначенная для вывода логов. Хотелось бы не писать свой логгер, а перенаправить вывод @Slf4j (logback) на форму. Написал свой appender, но проблема в том, что его нужно инициализировать в каждом классе отдельно (т. е. нужно постоянно получать ссылку на объект TextArea из главного контроллера), что крайне неудобно. Инициализация в методе initialize в контроллере (см. код ниже) позволяет перенаправить вывод slf4j только в текущем классе. Есть ли способ перенаправить вывод один раз и глобально, для всего проекта?
StaticOutputStreamAppender.java
public class StaticOutputStreamAppender<E> extends OutputStreamAppender<E> {
private static final DelegatingOutputStream DELEGATING_OUTPUT_STREAM = new DelegatingOutputStream(null);
@Override
public void start() {
setOutputStream(DELEGATING_OUTPUT_STREAM);
super.start();
}
public static void setStaticOutputStream(OutputStream outputStream) {
DELEGATING_OUTPUT_STREAM.setOutputStream(outputStream);
}
private static class DelegatingOutputStream extends FilterOutputStream {
public DelegatingOutputStream(OutputStream out){
super(new OutputStream() {
@Override
public void write(int b) {}
});
}
void setOutputStream(OutputStream outputStream) {
this.out = outputStream;
}
}
}
TextAreaLogger.java
public class TextAreaLogger extends OutputStream {
private final TextArea textArea;
public TextAreaLogger(TextArea textArea) {
this.textArea = textArea;
}
@Override
public void write(int b) {
Platform.runLater(() -> textArea.appendText(String.valueOf((char) b)));
}
}
Метод initialize в контроллере:
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
StaticOutputStreamAppender.setStaticOutputStream(new TextAreaLogger(loggingTextArea));*/
}
logback.xml
<appender name="textAreaAppender" class="yevhenii.screenshooter.logging.StaticOutputStreamAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{70}: %msg%n</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="STDOUT" />
<appender-ref ref="textAreaAppender" />
</root>