Ori*_*ion 4 java logging textarea
我目前正致力于在.log文件中记录来自我的应用程序的消息.到目前为止这工作正常,但现在我正在尝试将相同的消息输出到textarea.我一直在使用默认记录器.
这样我就有一个类可以完成记录到.log文件的所有工作,并将相同的输出写入textarea以供管理员查看.
这是一个Java swing JFrame应用程序,只包含一个textarea(我需要的全部).后台有很多工作,所有这些活动都必须记录下来进行审查/调试.
我一直在找一个很好的例子,所以我想知道你们是否可以帮助我.
在您的情况下,由于您使用的是JDK默认日志记录,因此您可以选择自己编写java.util.Handler并实现publish方法.有点像这样:
public class TextAreaHandler extends java.util.logging.Handler {
private JTextArea textArea = new JTextArea(50, 50);
@Override
public void publish(final LogRecord record) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
StringWriter text = new StringWriter();
PrintWriter out = new PrintWriter(text);
out.println(textArea.getText());
out.printf("[%s] [Thread-%d]: %s.%s -> %s", record.getLevel(),
record.getThreadID(), record.getSourceClassName(),
record.getSourceMethodName(), record.getMessage());
textArea.setText(text.toString());
}
});
}
public JTextArea getTextArea() {
return this.textArea;
}
//...
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以从Swing应用程序中的处理程序获取文本区域,有点像:
for(Handler handler: logger.getHandlers()){
if(handler instanceof TextAreaHandler){
TextAreaHandler textAreaHandler = (TextAreaHandler) handler;
getContentPane().add(textAreaHandler.getTextArea());
}
}
Run Code Online (Sandbox Code Playgroud)
然后,确保您的logging.properties文件包含新处理程序的配置:
hackers.logging.TestDrive.level=INFO
hackers.logging.TestDrive.handlers=hackers.logging.TextAreaHandler
Run Code Online (Sandbox Code Playgroud)
并且,如果您不打算将此配置放在默认logging.properties文件(位于JRE lib文件夹中)中,请确保logging.properties在应用程序启动时在属性中提供自定义文件的路径:
java -Djava.util.logging.config.file=my-customized-logging.properties ...
Run Code Online (Sandbox Code Playgroud)
只是从 StreamHandler 扩展 - 这就是 ConsoleHandler 和 FileHandler 的工作原理。并且,重写该publish函数:
public class TextAreaHandler extends StreamHandler {
JTextArea textArea = null;
public void setTextArea(JTextArea textArea) {
this.textArea = textArea;
}
@Override
public void publish(LogRecord record) {
super.publish(record);
flush();
if (textArea != null) {
textArea.appendText(getFormatter().format(record));
}
}
}
Run Code Online (Sandbox Code Playgroud)
在记录消息之前先设置输出位置,例如:
public TextAreaHandler textAreaHandler = new TextAreaHandler();
textAreaHandler.setTextArea(<your JTextArea control>);
Run Code Online (Sandbox Code Playgroud)