2010-11-22 38 views
0

需要逐步读取和处理日志文件。任何建议/想法在Java中做到这一点?在Java中逐步读取日志文件

需要考虑所有可能出现的情况,如文件侧翻,不同的日志记录格式等

感谢, Sudhanshu

+0

”逐步读取并处理日志文件。“ - 请添加更多详细信息。 – darioo 2010-11-22 10:37:02

+0

假设有一个应用程序正在生成日志(以文件形式),那么我想编写一个代码(使用Java),它将根据需要生成并处理这些最新日志。第一次读取日志不是问题,但我们如何跟踪最后一条记录/行读取?另外,如果由于大小或其他配置的参数而导致文件翻转,该怎么办? – 2010-11-22 11:08:54

+0

当我遇到这个问题时,我在这里找到了答案:http://www.informit.com/guides/content.aspx?g=java&seqNum=226 – Dan 2011-02-14 12:07:33

回答

2

虽然它很晚但想到编写我用来实现此功能的方法。

比方说,我们开始一项工作,每5分钟后定期读取一个文件。

  1. 在第一次运行时,将整个文件读
  2. 商店的线数和文件

的最后修改时间进行后续作业运行就变得有意思了。

  1. 在下次作业运行期间,检查文件是否被修改(使用文件上次修改时间和在早期作业运行期间存储的文件)。如果该文件未被修改,则不执行任何操作。
  2. 如果文件被修改,我们只需要阅读新的行。我们从早期的工作中获得行数,所以用它来确定要跳过的行数。

到目前为止很好,如果文件翻转过来呢?

  1. 假设我们有一个文件时,文件被辗过命名模式...
  2. 通过获取所有文件匹配模式,并根据最后修改时间的文件以升序进行排序
  3. 迭代文件,并从最后一次修改时间大于上次作业运行时间的那一个开始。使用存储线数巧妙地跳过已读线
  4. 复位线数,当你用一个新的文件启动之后

这就是它!

对于一些奇怪的场景,您可能需要在几个地方放置IF条件。其中一种情况是,当您迭代文件时,如果文件的上次修改时间与存储的文件完全相同,则只需重置行数 - 以便从下一个/新文件的第一行开始。对于后续作业

示例代码运行:

的(文件文件:文件){
如果(file.lastModified()> storedLastModifiedTime){
//你要处理的文件,照顾线计
}否则如果(file.lastModified()== storedLastModifiedTime){
//重置存储行计数
}
}

任何建议/意见/问题? “

3

你可以看看Chainsaw

+0

+1:你的第一段不太相关;这个问题是关于阅读日志,而不是写作。然而,电锯看起来完全适合。 – 2010-11-22 12:05:34

+0

我猜Chainsaw只适用于log4j,那么其他日志API呢? – 2010-11-23 02:44:48

+0

不知道任何其他人对不起(至少不是免费的开源软件) – 2010-11-23 09:45:12

0

我试图接近漂亮很多相同的问题。它看起来并不像看起来那么琐碎。您必须忽略EOF/EOS的概念,并且必须跟踪日志文件中的位置。

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

这种方法的唯一问题是N秒等待。有一种方法可以告诉Java“在readLine()上阻塞,而不管EOF/EOS”。随着第二次等待,您可能正在睡觉,而数据已经可用。然而,睡眠似乎是必要的,除非你想吃掉所有的CPU能力。

+0

我以为提问者是在现有代码/ lib之后进行此操作,而不是从头开始编写代码。 – 2010-11-22 12:06:32

+0

醒来后,如果尝试读取另一行,您还应该检查日志是否翻转。 – hidralisk 2010-11-22 16:54:21

+0

处理翻转日志是具有挑战性的部分。我们如何确定线程闲置时生成的日志文件的数量? – 2010-11-23 08:17:06