Ява читать журнал в прямом эфире - PullRequest
2 голосов
/ 04 мая 2011

Я пишу серверный контроллер cod4 на Java (я знаю, что серверные контроллеры прекрасно работают, но я хочу научиться этому).Теперь я хочу предпринять определенные действия в соответствии с записями в лог-файле, этот файл очень часто обновляется cod, и этот файл может стать довольно большим.Теперь, как мне эффективно читать только часть, которая изменилась в файле, каждую секунду или около того?

Или есть ли способ отправить все, что изменилось в файле журнала, в живую на Java? (Я читал кое-что отрубы).Сервер работает на Linux.Нет необходимости, чтобы файл журнала все еще сохранялся в том же месте, поскольку все должно проходить через Java, я могу просто сохранить его вместе с этим.

Допустима задержка около секунды или 2, но не более.

Ответы [ 3 ]

1 голос
/ 04 мая 2011

Пока вы читаете файл журнала, вы можете сделать паузу, когда больше нет записей, и продолжить обработку позже.Процесс будет продолжаться во время записи файла и будет читать только дополнительные строки, добавленные в конец.

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

Примечание: если файл закрыт и перевернут, это, вероятно, не будет работать,и вам придется сделать что-то более сложное, чтобы справиться с этим.

1 голос
/ 04 мая 2011

Может быть, вы могли бы выполнить подпроцесс tail -f logfile.txt и контролировать поток вывода?

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

0 голосов
/ 04 мая 2011

Вы можете использовать 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 - метод для обработки нового ввода из файла.

Это очень далеко от совершенства, но я думаю, что вы поняли.

...