Java 编写外部类以从MemoryHandler缓冲区推送日志消息

Java 编写外部类以从MemoryHandler缓冲区推送日志消息,java,Java,我正在编写一个Java日志框架,以将日志消息异步写入文件系统。为此,我使用MemoryHandler,它最终使用FileHandler写入文件。我不想在记录文件后立即将日志消息写入该文件,而是希望在缓冲区达到某个阈值时,通过外部类推送刷新内存中的所有内容。有人能给我举一个好例子,写这个外部类来显式地调用MemoryHandler的push方法吗?提前感谢。在添加要记录的消息的方法中(我们将其称为log(String msg)),您可以启动线程进行刷新,如下所示: public void log(

我正在编写一个Java日志框架,以将日志消息异步写入文件系统。为此,我使用MemoryHandler,它最终使用FileHandler写入文件。我不想在记录文件后立即将日志消息写入该文件,而是希望在缓冲区达到某个阈值时,通过外部类推送刷新内存中的所有内容。有人能给我举一个好例子,写这个外部类来显式地调用MemoryHandler的push方法吗?提前感谢。

在添加要记录的消息的方法中(我们将其称为
log(String msg)
),您可以启动线程进行刷新,如下所示:

public void log(String msg) {
  buffer.append(msg);
  if (buffer.length() > threshold) {
    new Thread() {
      public void run() {
        flush();
      }
    }.start();
  }

private void flush() {
  // ...
}
这将使flush保持异步,并避免创建整个类来调用一个方法,更不用说需要公开flush了,这可能是您不想做的


编辑:或者,如果已经设置了线程池,则可以创建一个新的Runnable,并将其传递给执行。不过,概念是一样的。

既然MemoryHandler可以(大概)判断何时达到阈值,为什么它不能自行刷新呢?谢谢您的反馈。它可以自行刷新,但我想通过从外部类(可能是线程)调用它来避免IO等待在线应用程序。非常感谢您的反馈。这很好用。我的另一个问题是,当flush使用一个单独的线程时,来自应用程序的传入日志会发生什么情况。应用程序是否必须等待该线程完成刷新现有缓冲区,或者它将如何工作?这有点令人困惑。谢谢。解决这个问题的一个方法是让
flush()
首先将挂起的消息复制到临时缓冲区并清除原始消息。如果将这些操作放在
synchronized
块中,则恰好在此时出现的新日志操作只需等待内存操作完成,然后继续写入新的缓冲区。同时,刷新线程将从调用它时的快照开始工作。这应该保证每个消息只写入文件一次。最后要考虑的是找到一种方法,确保在意外退出时刷新挂起的消息。不幸的是,我不太熟悉有哪些工具可用于此,因此我将让您研究在这方面有哪些选择。感谢您的洞察力。我做了一些研究,但并没有找到任何方法来按照您的建议将MemoryHandler的“buffer”内容读入临时缓冲区。如果您对此有任何想法,我们将不胜感激。谢谢。这取决于缓冲区的存储方式。如果要将其存储在ArrayList或LinkedList(或从其中一个派生的类)中,则应该能够使用列表上的
clone()
方法(当然,要记住进行正确的转换)。如果您只是使用数组,我相信该方法应该非常适合您。