Какими командами в Linux можно смотреть логи в реальном времени?
Что проверяют
Умеете ли вы сами поймать ошибку на стенде в момент воспроизведения бага и приложить к дефекту нужный кусок лога. Следом обычно спрашивают, как отфильтровать только ошибки или как посмотреть логи сервиса в Docker или Kubernetes.
Как отвечать
Назовите инструменты по тому, где лежат логи:
- файлы:
tail -f app.logпоказывает новые строки,tail -n 200 -F app.logсначала выводит последние 200 строк и продолжает следить даже после ротации, когда файл пересоздан; - less +F: тот же режим слежения, но по
Ctrl+Cможно остановиться, пролистать назад и поискать через/, а поFснова следить; - фильтр:
tail -F app.log | grep --line-buffered -E 'ERROR|WARN'. Флаг нужен, если вывод идёт дальше по конвейеру, иначеgrepкопит строки в буфере. Контекст после ошибки даётgrep -A 20; - systemd:
journalctl -u nginx -f, с--since "10 min ago"и-p errдля фильтра по времени и уровню; - контейнеры:
docker logs -f --tail 100 api,docker compose logs -f api,kubectl logs -f deploy/api -c app. Для упавшего и перезапущенного контейнераkubectl logs --previous; - несколько файлов сразу:
multitailилиlnav, если они установлены.
Хорошая практика: перед воспроизведением бага включить слежение, отметить время, повторить шаги и сохранить в дефект фрагмент с таймстемпом и идентификатором запроса. Если в логах есть trace_id или request_id, ищите по нему, а не по тексту ошибки.
Где спотыкаются
Используют tail -f на логе с ротацией. Когда logrotate переименовал файл и создал новый, команда продолжает читать старый и новых строк не показывает, нужен tail -F.
Фильтруют docker logs api | grep ERROR и не видят половины ошибок. Поток stderr контейнера идёт в stderr команды, поэтому нужно docker logs api 2>&1 | grep ERROR.
Прикладывают к багу весь лог за день. Разработчику нужен фрагмент на момент ошибки с временем и контекстом, иначе он будет искать то же самое заново.