CLI AI

Смотреть несколько логов одновременно

2026-06-17

Кажется, нужно просто tail -f app.log db.log, но на проде есть подвох: когда logrotate ротирует файл, она переименует его и создаст новый, а -f держит открытым старый файловый дескриптор и вы смотрите в замёрзший экран. Решение — один символ: -F переоткрывает файл по имени, а не по inode. Вот когда какой вариант использовать.

1. Показать оба файла с заголовками

clai
$ clai показывай оба этих лога одновременно→ tail -n +1 app.log db.log==> app.log <==line A1==> db.log <==line B1

Когда вы смотрите несколько файлов одновременно, tail автоматически печатает заголовки вроде ==> имя <==, чтобы показать, из какого источника пришла строка. Это критично — без заголовков вы не поймёте, из какого логе что.

2. Следить за обоими логами в реальном времени

clai
$ clai следи за обоими логами по мере появления строк→ tail -f app.log db.log

Заголовок печатается заново каждый раз, когда источник меняется. Пока пишет один файл, заголовка не видно, при переключении на другой появится.

3. Пережить ротацию логов и продолжить читать

clai
$ clai следи за логом так, чтобы не потерять его после ротации→ tail -F /var/log/app/app.log

Вот ради этой строки статья и написана. -f держит открытым файловый дескриптор: после ротации logrotate переименует файл, создаст новый, а tail -f останется смотреть в переименованный и замолчит навсегда. -F следит за именем и переоткрывает файл. На проде всегда -F.

4. Пометить каждую строку именем источника

clai
$ clai показывай оба лога вперемешку, но помечай каждую строку именем файла→ for f in app.log db.log; do tail -F "$f" | sed "s/^/[$f] /" & done; wait

Заголовки блоками неудобны, когда логи пишутся одновременно. Префикс на каждой строке читается лучше. & запускает каждый tail в фоне, wait держит оболочку.

5. Смотреть все лог-файлы в каталоге, включая созданные позже

clai
$ clai следи за всеми лог-файлами в каталоге→ tail -F /var/log/app/*.log

Шаблон разворачивается оболочкой один раз, при запуске. Файлы, созданные позже, в выборку не попадут — нужно перезапустить.

6. Когда нужен нормальный интерфейс с панелями

clai
$ 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 для сервисов? Он знает о ротации, умеет фильтровать по юниту и уровню и не зависит от того, куда сервис пишет файл.

Читайте также

Не запоминайте edge cases tail и logrotate — опишите, что нужно видеть, а команду напишет CliAI. Установка одной строкой.