在Java中逐步读取日志文件

时间:2010-11-22 10:28:27

标签: java logging

我需要逐步读取和处理日志文件。有关如何在Java中执行此操作的任何建议吗?

我需要考虑所有可能的情况,例如文件翻转,不同的日志记录格式等。

3 个答案:

答案 0 :(得分:3)

您可以查看Chainsaw

答案 1 :(得分:2)

虽然现在已经很晚了,但只是想到编写我用来实现此功能的方法。

假设我们开始工作,每隔5分钟定期读取一个文件。

  1. 首次运行时,请阅读整个文件
  2. 存储行数和文件的上次修改时间

    随后的工作运行会变得很有趣。

  3. 在下次作业运行期间,检查文件是否已修改(使用文件上次修改时间和早期作业运行期间存储的文件)。如果文件未被修改,则不执行任何操作。

  4. 如果文件被修改,我们只需要读取新行。我们有来自早期作业的行数,因此使用它来确定要跳过的行数。

    到目前为止一切顺利,如果文件被翻转怎么办?

  5. 假设我们在文件滚动时有文件命名模式......

  6. 获取与模式匹配的所有文件,并根据文件上次修改时间按升序对其进行排序
  7. 遍历文件并从上次修改时间大于上次作业运行时间的文件开始。巧妙地使用存储的行数来跳过已经读过的行
  8. 此后开始使用新文件时重置行计数
  9. 就是这样!

    对于某些奇怪的情况,您可能需要将IF条件放在少数几个位置。其中一种情况是,当您遍历文件时,如果文件的上次修改时间与存储的文件完全相同,只需重置行数 - 以便从下一个/新文件的第一行开始。

    后续作业的示例代码:

    for(File file : files) {<BR>
      if(file.lastModified() > storedLastModifiedTime) {<BR>
        // you have the file to process, take care of the line count<BR>
      } else if(file.lastModified() == storedLastModifiedTime) {<BR>
        // reset stored line count<BR>
      }<BR>
    }<BR>
    

答案 2 :(得分:0)

我正试图解决几乎相同的问题。它看起来并不像第一眼看上去那么微不足道。您必须忽略EOF / EOS的概念,并且必须跟踪日志文件中的位置。

我认为最好的方法是让一个单独的线程来读取日志文件。我用BufferedReader做了一个很有希望的测试。线程读取文件末尾的所有数据(其中readLine()返回null)并进入休眠状态N秒(在我的情况下为5)。然后醒来后再次尝试读一条线。如果它返回String,它继续处理。如果它得到null,它会再次进入睡眠状态。它会在每次成功读取时递增行计数器,并在停止/启动时写入/读取它,因此它可以在日志文件中找到最后一个位置并从该点开始。

这种方法唯一的问题是N秒等待。有一种方法可以告诉Java“阻止readLine()无论EOF / EOS如何”都会更加准确。在N秒等待时,您可能正在睡觉,而数据已经可用。然而,除非你想要耗尽所有的CPU能力,否则睡眠似乎是必要的。