我有一个 javaFX 应用程序,但遇到日志记录问题。我不知道如何将日志动态输出到 JavaFX 中的 TextArea 并同时输出到文件。
对于文件我有这样的设置:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.pattern = log.txt
在每个类中进行这样的静态初始化:
public class BuildTest{
static {
try(FileInputStream ins = new FileInputStream("src/main/resources/log.config")) {
LogManager.getLogManager().readConfiguration(ins);
LOGGER = Logger.getLogger(BuildTest.class.getName());
initialContext = new InitialContext();
} catch (NamingException | IOException e) {
LOGGER.log(Level.WARNING,"Error ", e);
}
}
}
但我有一个问题,如何同时输出到TextArea?
文本区域本身:
<TextArea layoutX="20.0" layoutY="705.0" prefHeight="100.0" prefWidth="560.0" fx:id="LogID"/>
并且控制器附加到 fxml 文件中:
public class ControllerFrame {
private TextArea LogID;
static {
try(FileInputStream ins = new FileInputStream("src/main/resources/log.config")){
LogManager.getLogManager().readConfiguration(ins);
LOGGER = Logger.getLogger(ControllerFrame .class.getName());
} catch (Exception e) {
LOGGER.log(Level.WARNING,"Error ", e);
}
}
}
我尝试将此代码插入到控制器类中的静态方法和初始化方法中:
TextAreaHandler handler = new TextAreaHandler(textArea);
handler.setFormatter(new SimpleFormatter());
LOGGER.addHandler(handler);
实现 TextAreaHandler 类:
package sample;
import java.util.logging.ErrorManager;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import javafx.application.Platform;
import javafx.scene.control.TextArea;
public class TextAreaHandler extends Handler {
private final TextArea textArea;
private volatile boolean open = true;
public TextAreaHandler(TextArea textArea) {
this.textArea = textArea;
}
@Override
public void publish(LogRecord record) {
if (open && isLoggable(record)) {
String message;
try {
message = getFormatter().format(record);
} catch (Exception ex) {
reportError(null, ex, ErrorManager.FORMAT_FAILURE);
return;
}
if (Platform.isFxApplicationThread()) {
appendMessage(message);
} else {
try {
Platform.runLater(() -> appendMessage(message));
} catch (Exception ex) {
reportError(null, ex, ErrorManager.GENERIC_FAILURE);
}
}
}
}
private void appendMessage(String message) {
try {
textArea.appendText(message);
} catch (Exception ex) {
reportError(null, ex, ErrorManager.GENERIC_FAILURE);
}
}
@Override
public void flush() {
// no buffer
}
@Override
public void close() {
open = false;
}
}
但我仍然没有在 TextArea 中收到日志。本质是应用程序在文本文件和文本区域中显示日志