Альтернатива для "tail -f", который следует за именем файла

5215
Hugh

У меня есть несколько журналов, генерируемых с использованием временного вращающегося файлового регистратора. Это записывает в файл с именем tool.log, и в полночь, перемещает это в tool.log.<date>и запускает новый tool.log.

У меня tail -f tool.logработает машина, которая следит за журналами, но в полночь, когда tool.logпереименовывается tool.log.<date>, tailпродолжает смотреть переименованный файл.

Я надеюсь, что инструмент похож на него tail, но будет продолжать следить за именем файла tool.log, а не следовать за индексом.

Существует ли что-то подобное? Если нет, я могу написать свой собственный на Python для этой цели.

59

6 ответов на вопрос

90
Toby Speight

Некоторые реализации tailимеют опцию для этого; вот описание со страницы руководства для хвоста GNU:

-F
такой же как --follow=name --retry

-f, --follow[ ={ имя | дескриптор }]
выводить добавленные данные по мере роста файла; -f, --followИ --follow=descriptorэквивалентны

--retry
продолжайте пытаться открыть файл, даже если он или становится недоступным; полезно при следовании по имени, т. е. с--follow=name

Так как этот параметр не указан в POSIX, вы не можете зависеть от него везде. Некоторые известные реализации:

  • GNU - имеет,-Fкак описано выше
  • Mac OS X , FreeBSD и NetBSD - имеют похожую-Fопцию с одинаковым эффектом
  • OpenBSD --fдостаточно (если файл будет заменен (т. Е. Номер инода изменится), tail снова откроет файл и продолжит)
  • Солярис - не эквивалент
  • Busybox --Fдоступен в последних версиях, но должен быть скомпилированENABLE_FEATURE_FANCY_TAIL(по умолчанию он не скомпилирован)
55
Oleg Bolden

Альтернативой является tail -Fкоманда.

-FОпция подразумевает --follow=nameс --retryопцией, так что хвост смотрит ваш файл, даже если он был удален и создан заново.

4
Arronical

Другой альтернативой будет использование watchкоманды, которая будет повторять любую команду каждые n секунд, каждые 2 секунды в этом примере:

watch -n2 "tail tool.log" 

Используйте Ctrl+, Cчтобы выйти из команды, когда вы закончите просмотр журнала.

Похоже, что это создаст много дубликатов сообщений, если журнал прокручивается медленнее, чем таймер обновления, и пропустит некоторые сообщения, если прокрутится быстрее. Bobson 8 лет назад 1
Часы занимают весь экран, поэтому они не дублируют сообщения, но лишают возможности прокручивать назад. Hugh 8 лет назад 3
3
Wayne Werner

lnav - это еще один фантастический инструмент, который следует за именем файла.

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

Я обнаружил, что он не обрабатывает усеченные и / или переименованные повернутые журналы (я не уверен, что расстраивает его в моем конкретном случае), поэтому журналы, по-видимому, останавливаются в полночь, пока я не перезапущу lnav. Мне не хватает какого-то очевидного переключателя или техники для этого, мне интересно, так как это кажется чем-то, что нужно принять в своем шаге? Stuart Hickinbottom 7 лет назад 0
Это зависит от того, как файл обрезается. Если вы передадите флаг `-r` в lnav, он перезагрузит имя файла (и загрузит все ранее свернутые логи) Wayne Werner 7 лет назад 0
3
VL-80

Since you have asked for alternative:

The less utility could be an alternative for tail -F.

It will have to be run as follows: less --follow-name filename.log and press Shift + F.

This will give you same results as tail -F.

Благодарю. Я был только после альтернативы, потому что я не знал о хвосте -F. Всегда приятно знать варианты, хотя. Hugh 8 лет назад 0
1
Andy Lester

Я не уверен, что multitailсправится с вашим конкретным случаем, но держу пари, что так и будет. multitail делает практически все, что вы могли tailбы сделать.

https://en.wikipedia.org/wiki/MultiTail

Да будет - `multitail -f -f -f ... `. Этот пример показывает следующие несколько файлов одновременно, которые будут показаны в отдельных окнах. Stuart Hickinbottom 7 лет назад 1

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