Эффективное отслеживание нескольких файлов журнала - PullRequest
0 голосов
/ 28 сентября 2010

Я собираюсь создать программу, которая может постоянно следить за большим динамическим набором файлов журналов, чтобы копировать их записи в базу данных для упрощения статистики почти в реальном времени.Файлы журналов пишутся различными демонами и приложениями, но формат их известен, поэтому их можно анализировать.Некоторые из демонов записывают журналы в один файл в день, например, cronolog Apache, который создает файлы, такие как access.20100928.Эти файлы появляются с каждым новым днем ​​и могут исчезнуть, когда они будут разархивированы на следующий день.

Целевой платформой является сервер Ubuntu, 64-битный.

Какой наилучший подход кэффективно читать эти файлы журналов?

Я мог бы подумать о таких языках сценариев, как PHP, которые либо сами открывают файлы и читают новые данные, либо используют системные инструменты, такие как tail -f, для отслеживания журналов, либо другие среды выполнения, такие как Mono.Сценарии оболочки Bash, вероятно, не очень подходят для анализа строк журнала и их вставки на сервер базы данных (MySQL), не говоря уже о простой настройке моего приложения.

Если моя программа будет читать файлы журнала, Я думаю, что он должен stat () файл раз в секунду или около того, чтобы получить его размер и открыть файл, когда он растет.После прочтения файла (который, мы надеемся, должны возвращать только полные строки), он может вызвать tell (), чтобы получить текущую позицию, и в следующий раз напрямую искать () в сохраненной позиции, чтобы продолжить чтение.(Это имена функций C, но на самом деле я не хотел бы делать это в C. И Mono / .NET или PHP также предлагают аналогичные функции.)

Является ли эта постоянная статистика () файлови последующее открытие и закрытие проблемы?Как бы tail -f сделал это?Могу ли я оставить файлы открытыми и получать уведомления о новых данных с помощью что-то вроде select ()?Или он всегда возвращается в конце файла?

В случае, если я заблокирован каким-то видом select () или внешним хвостом, мне нужно прерывать это каждые 1, 2 минуты для сканированияновые или удаленные файлы, за которыми (более) не следует следить.Возобновление с tail -f тогда вероятно не очень надежно.Это должно работать лучше с моими собственными сохраненными позициями в файле.

Могу ли я использовать для этого какое-то inotify (уведомление файловой системы)?

1 Ответ

1 голос
/ 29 сентября 2010

Если вы хотите узнать, как работает tail -f, почему бы не взглянуть на источник ?Короче говоря, вам не нужно периодически прерывать или постоянно использовать stat () для поиска изменений в файлах или каталогах.Вот что делает inotify.

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