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

Posted

技术标签:

【中文标题】将记录器消息写入文件和文本区域,同时保持 Java 中的默认行为【英文标题】:Write logger message to file and textarea while maintaining default behaviour in Java 【发布时间】:2012-06-02 20:59:24 【问题描述】:

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

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

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

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

【问题讨论】:

是网页的文本区域吗? 不,它适用于应用程序(非网络) 是来自 Java AWT、Swing 或他们的 GUI 框架的文本区域???,为了更好的帮助,请尽快使用 SSCCE 编辑您的问题,证明您的问题 我们说的是 Java 标准日志 API 还是一些第三方库? 我为此使用了默认记录器。全部默认。该应用程序不允许使用第三方库。 【参考方案1】:

在您的情况下,由于您使用的是 JDK 默认日志记录,您的选择是编写自己的 java.util.Handler 并实现发布方法。有点像这样:

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;
    

    //...

然后,您可以从 Swing 应用程序中的处理程序获取文本区域,有点像:

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

然后,确保您的 logging.properties 文件包含新处理程序的配置:

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

而且,如果您不打算将此配置放在默认的 logging.properties 文件中(位于 JRE lib 文件夹中),请确保在应用程序启动时在属性中提供自定义 logging.properties 文件的路径:

java -Djava.util.logging.config.file=my-customized-logging.properties ...

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于将记录器消息写入文件和文本区域,同时保持 Java 中的默认行为的主要内容,如果未能解决你的问题,请参考以下文章

如何将HTML中下拉菜单和文本区域的值传递到java中的

PHP、mySQL、换行符和文本区域

form.serialize() 用于输入字段和文本区域

PHP 整洁和文本区域

验证输入框和文本区域

输入文本框和文本区域自动清除