【问题标题】:Java read a logfile liveJava 实时读取日志文件
【发布时间】:2011-05-04 15:47:39
【问题描述】:

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

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

大约一两秒的延迟是可以接受的,但不能再延长了。

【问题讨论】:

    标签: java linux io pipe tail


    【解决方案1】:

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

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

    【讨论】:

    • 'tail -f logfile.txt > java -jar test.jar'之类的东西也可以吗?
    • 当然,那么你可以从标准输入读取。您是否曾经直接从终端输入日志条目?是程序日志文件条目的主要输入吗?附言你需要一根管子|不是 >
    • 确实使用了管道,它真的很有魅力,谢谢:)
    【解决方案2】:

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

    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
      }
    }
    

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

    【讨论】:

    • 也是一个有效的解决方案,但我发现 rohannes 的解决方案更优雅一些。如果由于某种原因这不起作用,尽管我可能会使用这个:)。
    【解决方案3】:

    您可以使用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 是一种处理来自文件的新输入的方法。

    这远非卓越,但我想你明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多