Кажется, нужно просто tail -f app.log db.log, но на проде есть подвох: когда logrotate ротирует файл, она переименует его и создаст новый, а -f держит открытым старый файловый дескриптор и вы смотрите в замёрзший экран. Решение — один символ: -F переоткрывает файл по имени, а не по inode. Вот когда какой вариант использовать.
1. Показать оба файла с заголовками
$ clai показывай оба этих лога одновременно→ tail -n +1 app.log db.log==> app.log <==line A1==> db.log <==line B1
Когда вы смотрите несколько файлов одновременно, tail автоматически печатает заголовки вроде ==> имя <==, чтобы показать, из какого источника пришла строка. Это критично — без заголовков вы не поймёте, из какого логе что.
2. Следить за обоими логами в реальном времени
$ clai следи за обоими логами по мере появления строк→ tail -f app.log db.log
Заголовок печатается заново каждый раз, когда источник меняется. Пока пишет один файл, заголовка не видно, при переключении на другой появится.
3. Пережить ротацию логов и продолжить читать
$ clai следи за логом так, чтобы не потерять его после ротации→ tail -F /var/log/app/app.log
Вот ради этой строки статья и написана. -f держит открытым файловый дескриптор: после ротации logrotate переименует файл, создаст новый, а tail -f останется смотреть в переименованный и замолчит навсегда. -F следит за именем и переоткрывает файл. На проде всегда -F.
4. Пометить каждую строку именем источника
$ clai показывай оба лога вперемешку, но помечай каждую строку именем файла→ for f in app.log db.log; do tail -F "$f" | sed "s/^/[$f] /" & done; wait
Заголовки блоками неудобны, когда логи пишутся одновременно. Префикс на каждой строке читается лучше. & запускает каждый tail в фоне, wait держит оболочку.
5. Смотреть все лог-файлы в каталоге, включая созданные позже
$ clai следи за всеми лог-файлами в каталоге→ tail -F /var/log/app/*.log
Шаблон разворачивается оболочкой один раз, при запуске. Файлы, созданные позже, в выборку не попадут — нужно перезапустить.
6. Когда нужен нормальный интерфейс с панелями
$ clai покажи несколько логов в отдельных панелях→ multitail /var/log/syslog /var/log/auth.log
multitail рисует панели, умеет подсветку и фильтры. Для разбора инцидента с четырьмя логами это заметно удобнее, чем один поток. Ставится отдельно.
Грабли
-fи-Fразличаются только на ротации. Пока лог не ротируется, разницы нет, и привычка ставить-fне наказывается. Наказывается она ровно в тот момент, когда вы ждёте строки во время инцидента.tail -fпо сети работает плохо. На NFS изменения могут не доходить до клиента. Смотрите лог на той машине, где он пишется.- Строки могут перемешаться. Два процесса, пишущих в один поток, не синхронизированы. Для разбора порядка событий смотрите метки времени внутри строк, а не порядок вывода.
Похожие вопросы
Как смотреть лог с определённого места, а не с конца? tail -n +100 file начнёт со сотой строки, tail -c +1000 — с тысячного байта.
Как следить за логом и одновременно фильтровать? tail -F app.log | grep --line-buffered ERROR. Без --line-buffered grep будет копить вывод в буфере, и строки появятся с задержкой.
Чем journalctl лучше tail для сервисов? Он знает о ротации, умеет фильтровать по юниту и уровню и не зависит от того, куда сервис пишет файл.
Читайте также
- Read a service's logs with journalctl
- Sweep old logs and backups with one sentence
- Grep with exclusions
Не запоминайте edge cases tail и logrotate — опишите, что нужно видеть, а команду напишет CliAI. Установка одной строкой.