У меня есть программное обеспечение, которое ротирует свои файлы журнала при перезапуске. Однако во время разработки я часто его перезапускаю, поэтому мне хотелось бы отслеживать последний файл журнала в любое время.
Если я начинаю less
нормально с less program.log
и нажимаю Shift+ fдо конца, когда файл журнала ротируется, я продолжаю следить за старым файлом журнала. Я предполагаю, что это происходит потому, что номер inode остается прежним и less
имеет открытый файловый дескриптор для этого inode.
Возможно ли отслеживать последнюю активность в любом файле журнала, который в данный момент называется program.log
?
В частности, я работаю на Sun OS, поэтому решение, работающее там, было бы идеальным.
решение1
Используйте less --follow-name
, если ваша версия less
поддерживает это.
Эта опция была введена в версии 416.
Затем выполните обычную команду follow Shift+Fвнутри less
.
решение2
Этот less
вариант --follow-name
— лишь часть решения;
для замены tail -F
необходим еще один аргумент:
less --follow-name +F file.log
Опция сама по себе, как less --follow-name file.log
не начинает отслеживать обновления файлов. Вам нужно войти в режим отслеживания, нажав ShiftF.
(Выйдите из режима, чтобы перейти по ControlC.)
Вместо того, чтобы следовать файлу,--follow-name
изменяет поведениеиз less.
Он делает командный ключ ShiftFвнутри less
follow на основе имени файла, а не дескриптора файла.
Также нет нормальной опции для запуска less
в режиме follow.
Но вы можете использовать командную строку, чтобы датьнажатия клавиш для выполненияпосле запуска, добавив к ним префикс +
.
Сочетание опции модификатора с +F
, less
фактически запустится в (измененном) режиме следования.
Используйте +F
отдельно для эквивалента простого tail -f
:
less +F file.log
решение3
Я только что нашел ответ в этом разделе вопросов и ответов U&L под названием:Как сделать tail -f
лог ротированных файлов?.
С использованием tail
:
(если установка GNU tail на вашу систему возможна)
tail -F program.log
-f, --follow[={name|descriptor}]
output appended data as the file grows; -f,
--follow, and --follow=descriptor are equivalent
-F same as --follow=name --retry
--retry keep trying to open a file even when it is or becomes
inaccessible; useful when following by name, i.e., with
--follow=name
Ключ — это --retry
переключатель. Он сообщает tail
команде, что нужно продолжать повторять попытки следовать за файлом по имени. Переключатель -F
делает и a -f
, и a --retry
.
С использованиемless
Как отметил @StephaneChazela в комментариях, следующее не сработает.
tail -F program.log | less
Единственный другой вариант, который у вас есть, — это использовать less напрямую, предполагая, что он поддерживает --follow-name
переключатель и less
файл напрямую, tail
полностью отказавшись от использования.
less --follow-name program.log