Perl File :: Tail syncronization - PullRequest
       20

Perl File :: Tail syncronization

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

у меня такая ситуация: Я анализирую некоторые файлы журнала с помощью демона perl. Этот демон записывает данные в mysql db.

Файл журнала может:

  1. быть повернутым ('решено размером файла и некоторой логикой')
  2. не существует (параметр ignore_nonexistant в Tail)

Daemon:

  1. Может быть убит
  2. Может умереть по какой-то причине.

Я использую File :: Tail, чтобы привязать файл. Для ротации файлов может помочь механизм даты создания или размера файла. и какой механизм я должен использовать, чтобы начать хвост из некоторой позиции в файле? (предположим, что таких демонов много, нет доступа на запись в файловую систему).

Я думаю о переменной положения в БД, но это мне не поможет.

Может быть, какой-нибудь механизм для передачи параметра позиции в процесс parrent?

Я просто не хочу изобретать велосипед.

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Попробуйте http://search.cpan.org/dist/Log-Unrotate/. Вам придется реализовать свой собственный класс Log::Unrotate::Cursor, если вы хотите хранить файлы позиции в БД, а не в локальной файловой системе, но это должно быть тривиально.и использовал Log::Unrotate в течение 5 лет в производстве, и он изо всех сил старается никогда не пропускать какие-либо данные.(Он так старается, что выдает исключение, если ваш курсор становится недействительным, например, если журнал вращался несколько раз, когда читатель по какой-то причине не работал. Вы можете включить опцию autofix_cursor, чтобы изменить это поведение).*

Также взгляните на http://search.cpan.org/dist/File-LogReader/. Я никогда не использовал его, но он должен был решить ту же задачу.

2 голосов
/ 18 мая 2011

File :: Tail уже обнаруживает ротацию и продолжает чтение из нового файла.

Чтобы справиться с умиранием и перезапуском демона, вы можете запросить в базе данных последнюю запись, записанную при перезапуске демона, и простопропустить строки журнала, пока не перейдете к более поздней строке?

...