将记录器消息写入文件和文本区域,同时保持 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 中的默认行为的主要内容,如果未能解决你的问题,请参考以下文章