Чтение лог файлов постепенно в Java - PullRequest
0 голосов
/ 22 ноября 2010

У меня есть требование читать и обрабатывать файл журнала постепенно. Любые предложения о том, как сделать это на Java?

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

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Вы можете взглянуть на Бензопила

2 голосов
/ 18 февраля 2013

Хотя уже довольно поздно, но я подумал о написании подхода, который я использовал для достижения этой функциональности.

Допустим, мы начинаем задание периодически читать файл, каждые 5 минут.

  1. Во время первого запуска прочитайте весь файл
  2. Количество строк магазина и время последнего изменения файла

    Это становится интересным для последующих запусков задания.

  3. Во время следующего запуска задания проверьте, был ли файл изменен (используя время последнего изменения файла и тот, который был сохранен во время предыдущего запуска задания).Если файл не изменен, ничего не делать.

  4. Если файл изменен, нам просто нужно прочитать новые строки.У нас есть счетчик строк из предыдущего задания, поэтому используйте его, чтобы определить количество пропускаемых строк.

    Пока все хорошо, что, если файл переворачивается?

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

  6. Получить все файлы, соответствующие шаблону, и отсортировать их в порядке возрастанияв зависимости от времени последнего изменения файла
  7. Перебирайте файлы и начинайте с того, чье время последнего изменения больше времени, сохраненного во время предыдущего запуска задания.Используйте сохраненный счетчик строк, чтобы пропустить уже прочитанные строки
  8. Сбросьте счетчик строк при запуске с новым файлом после этого

Вот и все!

Возможно, вам потребуетсяПоложите условия 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>
0 голосов
/ 22 ноября 2010

Я пытаюсь приблизиться к той же самой проблеме.Кажется, это не так тривиально, как может показаться на первый взгляд.Вы должны игнорировать понятие EOF / EOS, и вы должны отслеживать, где в файле журнала вы находитесь.

Я думаю, что лучший подход - создать отдельный поток для чтения файла журнала.Я сделал тест с BufferedReader, что довольно многообещающе.Поток считывает все данные до конца файла (где readLine() возвращает null) и переходит в спящий режим на N секунд (5 в моем случае).Затем после пробуждения снова пытается прочитать строку.Если он возвращает String, он продолжает обработку.Если он получает null, он снова ложится спать.Он увеличивает счетчик строк при каждом успешном чтении и записывает / читает его при остановке / запуске, поэтому он может найти последнюю позицию в файле журнала и продолжить с этой точки.

Единственная проблема с этим подходом - это N-секундаПодождите.Было бы гораздо точнее, если бы у Java был способ указать «блокировать readLine() независимо от EOF / EOS».С N секундным ожиданием вы можете спать, пока данные уже доступны.Однако сон кажется необходимым, если вы не захотите съесть всю мощность процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...