5

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

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

这是一个 Java swing JFrame 应用程序,只包含一个文本区域(我需要的全部)。后台发生了一堆事情,所有这些活动都必须记录下来以供审查/调试。

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

4

3 回答 3

9

In your case, since you are using JDK default logging, your option is to write your own java.util.Handler and implement the publish method. Somewhat like this:

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;
    }

    //...
}

Then, you can get the text area from your handler in your Swing application, somewhat like:

for(Handler handler: logger.getHandlers()){
    if(handler instanceof TextAreaHandler){
        TextAreaHandler textAreaHandler = (TextAreaHandler) handler;
        getContentPane().add(textAreaHandler.getTextArea());
    }
}

Then, you make sure your logging.properties file contains the configuration of your new handler:

hackers.logging.TestDrive.level=INFO
hackers.logging.TestDrive.handlers=hackers.logging.TextAreaHandler

And, if you are not going to put this configuration in your default logging.properties file (located in your JRE lib folder) then make sure to provide the path to your customized logging.properties file in a property at application startup:

java -Djava.util.logging.config.file=my-customized-logging.properties ...
于 2012-05-28T15:55:56.257 回答
4

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

在记录消息之前先设置输出位置,例如:

public TextAreaHandler textAreaHandler = new TextAreaHandler();
textAreaHandler.setTextArea(<your JTextArea control>);
于 2015-02-11T06:56:53.857 回答
2

如果它是一个单体应用程序,您可以编写log4j custom appender它将调用 textarea 内容的更新并在那里添加新行。
如果有两个独立的应用程序(一个产生日志,一个显示日志),您可以在它们之间建立一种连接(套接字/消息传递等),以通知管理应用程序有关记录的行并更新它们。

于 2012-05-28T13:40:52.400 回答