将记录器消息写入文件和textarea,同时保持Java中的默认行为

Ori*_*ion 4 java logging textarea

我目前正致力于在.log文件中记录来自我的应用程序的消息.到目前为止这工作正常,但现在我正在尝试将相同的消息输出到textarea.我一直在使用默认记录器.

这样我就有一个类可以完成记录到.log文件的所有工作,并将相同的输出写入textarea以供管理员查看.

这是一个Java swing JFrame应用程序,只包含一个textarea(我需要的全部).后台有很多工作,所有这些活动都必须记录下来进行审查/调试.

我一直在找一个很好的例子,所以我想知道你们是否可以帮助我.

Edw*_*rzo 8

在您的情况下,由于您使用的是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)


Tha*_*Van 5

只是从 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)