Просмотр только новых записей в растущем файле журнала

Вы не можете заставить ядро ​​сообщать вам только об изменении определенного пути. Причины немного тонкие:

  • В Linux объект файла существует независимо от любого имени (имен), которое он может иметь. Имена файлов на самом деле являются атрибутами их содержащего каталога, и один файл может вызываться несколькими именами (см. Жесткую привязку).

  • В ядре должно быть что-то, к чему можно прикрепить объекты inotify; он не может прикрепить объект к имени пути, поскольку имя пути не является реальным объектом файловой системы; вы должны присоединиться к родительскому каталогу или файлу, который описывает путь. Но вы не можете прикрепить к файлу, потому что вы смотрите, чтобы увидеть, создается ли файл с заданным именем, а не изменяется данный файл.

Теоретически ядро ​​могло бы реализовать API, который позволяет вам выбирать события для заданного пути при добавлении часов в каталог, почти так же, как он позволяет вам выбирать типы событий. Это приведет к раздуванию API, и ядро, в конце концов, будет обрабатывать те же данные и выполнять то же сравнение строк, что и в пользовательском пространстве.

Есть ли заметное снижение производительности при установке часов в очень активном каталоге? Я не уверен, насколько вы активны; десятки файлов в секунду, сотни, миллионы?

В любом случае, я бы избегал доступа : он всегда будет гоночным. Файл может быть создан и удален между вызовами access , и вызов access в очень плотном цикле будет медленным, и это проблема inotify ] был разработан для решения.

20
01.07.2015, 17:43
1 ответ

Я применил этот подход, когда мне нужно было отслеживать записи внутри контейнера докеров:

LOG_COUNT=0
LOGS=/var/logs/your_logs

function HEART_BEAT() {
    LOG_COUNT_NEW=$(wc -l $LOGS | awk '{ print $1 }')
    tail -n $(( $LOG_COUNT_NEW - $LOG_COUNT )) $LOGS
    LOG_COUNT=$LOG_COUNT_NEW
}

Надеюсь, это поможет!

0
27.01.2020, 19:43

Теги

Похожие вопросы