Java实时读取日志文件

时间:2011-05-04 15:47:40

标签: java linux io pipe tail

我正在用Java编写cod4服务器控制器(我知道那里有完美的服务器控制器,但我想从中学习)。现在我想根据日志文件中的条目采取特定的操作,这个文件经常被cod更新,文件可能会变得非常大。现在,我如何每隔一秒左右有效地只读取文件已更改的部分?

或者有没有办法将日志文件中的所有内容发送到Java?(我读了一些关于管道的东西)。服务器在linux上运行。不需要将日志文件保存在同一位置,因为所有内容都应该通过Java我可以保存它。

延迟大约一秒钟或2秒是可以接受的,但不能再延迟。

3 个答案:

答案 0 :(得分:1)

也许你可以执行'tail -f logfile.txt'子流程并监控输出流?

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html

答案 1 :(得分:1)

在读取日志文件时,可以在没有其他条目时暂停,并在以后继续处理。在写入文件时,该过程将继续运行,并且只会读取附加到末尾的其他行。

BufferedReader br = ...;
String line = null;
while (true) {
  line = br.readLine();
  if (line == null) // nothing more to read, wait... 
  {
    Thread.sleep(delay);
  } else {
    process(line); // take action
  }
}

注意:如果文件被关闭并翻转,这可能不起作用,你将不得不做一些更复杂的事情来处理它。

答案 2 :(得分:0)

您可以使用RandomAccessFile。您可以将指针存储到您有红色的最后一个字节,如下所示:

String pathToYourFile = "/path/to/your/logfile";
long lastBytePosition = 0;
boolean shouldStop = false;
while (! shouldStop) {
    Thread.sleep(2000);
    File f = new File(pathToYourFile);
    long length = f.length();
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    byte[] buff = new byte[(int) (length - lastBytePosition)];
    raf.readFully(buff, (int) lastBytePosition, (int) (length - lastBytePosition));
    shouldStop = processChunk(buff);
    lastBytePosition = (int) length;
}

...其中processChunk是一种处理文件新输入的方法。

这与卓越相去甚远,但我认为你有了这个想法。