Я собираюсь создать программу, которая может постоянно следить за большим динамическим набором файлов журналов, чтобы копировать их записи в базу данных для упрощения статистики почти в реальном времени.Файлы журналов пишутся различными демонами и приложениями, но формат их известен, поэтому их можно анализировать.Некоторые из демонов записывают журналы в один файл в день, например, 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 (уведомление файловой системы)?