Гайды

Как смотреть лог в реальном времени — и почему tail -f замолкает ночью

Иллюстрация: из щели в стене медленно ползёт бумажная лента, а робот следит за её нижним краем через лупу

Сервер работает, пользователи жалуются, а ты открываешь лог и видишь вчерашний день. Обновляешь — сегодня. Обновляешь ещё — уже новые строки. Так можно сидеть часами.

Есть способ проще: смотреть лог вживую, как ленту новостей. Новая строка в файле — сразу у тебя на экране. Это одна команда. Но у неё есть два подвоха, о которые спотыкаются почти все. Например, вечером всё работает, а утром экран молчит, хотя ошибки сыпались всю ночь.

Пойдём по шагам. Нужен только терминал и файл лога.

Шаг 1. Включи слежение

tail -f app.log

tail показывает конец файла, последние 10 строк. Флаг -f (follow, «следуй») не даёт команде завершиться. Она ждёт и печатает каждую новую строку, как только та появилась.

Хочешь больше контекста на старте? Добавь число:

tail -n 100 -f app.log

Выход — Ctrl+C. Сам файл от этого не пострадает: tail только читает.

Шаг 2. Оставь только ошибки

Лог шумный, тебе нужны только ошибки. Подключи grep через пайп:

tail -f app.log | grep ERROR

Работает. Теперь хочешь убрать ещё и шум от проверок здоровья:

tail -f app.log | grep ERROR | grep -v healthcheck

И… тишина. Ошибки в файле есть, а на экране пусто.

Вот первый подвох. Первый grep видит, что пишет не в окно, а в трубу. И начинает копить строки пачками по несколько килобайт. Пока пачка не наберётся, следующий grep не получит ничего. На тихом логе это могут быть часы. Подробнее, почему программы так делают, — в разборе что такое TTY.

Лечится флагом:

tail -f app.log | grep --line-buffered ERROR | grep -v healthcheck

Правило: каждому grep, кроме последнего в цепочке, — --line-buffered.

Бывает, что выкидывать остальные строки жалко: контекст вокруг ошибки тоже важен. Тогда не фильтруй, а подсвечивай:

tail -f app.log | grep --color=always -E 'ERROR|$'

Хитрость в |$. Это «или конец строки», а конец есть у каждой строки. Значит, проходят все. Но цветом выделено только слово ERROR.

Шаг 3. Переживи ротацию лога

Второй подвох. Логи не растут вечно. Ночью система делает ротацию: переименовывает app.log в app.log.1 и создаёт новый пустой app.log.

А tail -f держится не за имя, а за сам файл. Файл переименовали — tail послушно следит за app.log.1. Туда больше никто не пишет. Ошибки летят в новый app.log, а у тебя на экране тишина.

Нужна большая буква:

tail -F app.log

-F следит за именем. Когда файл подменили, он пишет «has become inaccessible», потом «following new file» — и продолжает уже с новым файлом. Для логов на сервере бери всегда -F.

Шаг 4. Листай назад, не теряя ленту

Увидел ошибку и хочешь посмотреть, что было за минуту до неё? С tail это неудобно. Открой лог в less в режиме слежения:

less +F app.log

Это та же живая лента. Но теперь:

  1. Ctrl+C — остановить ленту, файл замер.
  2. /timeout и Enter — найти слово, n — следующее совпадение.
  3. F (заглавная) — снова включить слежение.
  4. q — выйти.

Шаг 5. Если лог не в файле

Часто приложение пишет не в файл, а в поток вывода. У каждого окружения своя команда, но флаг почти всегда тот же -f:

docker logs -f my-app          # контейнер Docker
journalctl -u my-app -f        # сервис systemd на Linux
kubectl logs -f my-pod         # Kubernetes

А свой dev-сервер можно и смотреть, и сохранять одновременно:

pnpm dev 2>&1 | tee dev.log

2>&1 склеивает ошибки с обычным выводом — про это есть разбор stdout и stderr. tee показывает поток на экране и пишет его в файл.

Что получится

У тебя на экране живая лента: только ошибки, без шума, и она не замолкнет после ночной ротации. А когда найдёшь подозрительное место, отдай кусок лога ИИ:

tail -n 200 app.log | claude -p "Почему падает оплата? Найди первую ошибку и причину"

Модель увидит настоящий контекст, а не твой пересказ. Как вообще читать логи и что в них искать — в отдельной статье.

Как следить сразу за несколькими файлами?

Перечисли их подряд: tail -F app.log worker.log. Перед каждой порцией строк tail напишет имя файла, из которого она пришла.

Как смотреть лог в реальном времени в Windows?

В PowerShell: Get-Content app.log -Wait -Tail 20. Это аналог tail -f. В WSL работает обычный tail.

tail -f нагружает сервер?

Почти нет. Команда спит и просыпается, только когда файл изменился. Держать её открытой часами — нормально.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →