我需要逐步读取和处理日志文件。有关如何在Java中执行此操作的任何建议吗?
我需要考虑所有可能的情况,例如文件翻转,不同的日志记录格式等。
答案 0 :(得分:3)
您可以查看Chainsaw
答案 1 :(得分:2)
虽然现在已经很晚了,但只是想到编写我用来实现此功能的方法。
假设我们开始工作,每隔5分钟定期读取一个文件。
存储行数和文件的上次修改时间
随后的工作运行会变得很有趣。
在下次作业运行期间,检查文件是否已修改(使用文件上次修改时间和早期作业运行期间存储的文件)。如果文件未被修改,则不执行任何操作。
如果文件被修改,我们只需要读取新行。我们有来自早期作业的行数,因此使用它来确定要跳过的行数。
到目前为止一切顺利,如果文件被翻转怎么办?
假设我们在文件滚动时有文件命名模式......
就是这样!
对于某些奇怪的情况,您可能需要将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能力,否则睡眠似乎是必要的。