Поиск по логам

Обновлено 12 августа 2026 · 5 мин чтения

Найти строку — половина дела. Обычно нужно ещё понять, что происходило вокруг неё и чем это кончилось.

Контекст

Три строки до и после

Одинокая строка с ошибкой почти никогда не объясняет причину. -C даёт симметричный контекст, -B и -A — только до или только после.

grep -n -C 3 'error' app.log

Показать номера строк и перейти к ним

-n печатает номер строки, дальше можно открыть файл сразу на нужном месте.

grep -n 'panic' app.log
less +1247 app.log

Убрать шум

Исключить несколько шаблонов сразу

Health-чеки и фавиконки забивают вывод. Каждый -e добавляет ещё один шаблон к исключению.

grep -v -e '/healthz' -e '/favicon' -e 'kube-probe' access.log

Шаблоны из файла

Когда исключений становится больше пяти, держите их списком. По строке на шаблон.

grep -F -v -f noise.txt access.log

Только посчитать

-c выводит число совпадений вместо самих строк. Полезно, чтобы понять масштаб до того, как вываливать всё в терминал.

grep -c 'timeout' app.log

Скорость

Отключить регулярки

-F ищет фиксированную строку. На больших файлах разница ощутимая, плюс не нужно экранировать точки и слэши.

grep -F '/api/v2/orders?id=' access.log

Остановиться после N совпадений

Если нужно просто убедиться, что явление есть, не читайте файл до конца.

grep -F -m 1 'OutOfMemory' /var/log/syslog

ripgrep, когда файлов много

Ищет рекурсивно, параллельно и по умолчанию пропускает бинарники. Ставится как ripgrep.

rg -n --no-heading 'ERROR' /var/log
rg -n -g '*.log' 'segfault' /var/log

Архивы и каталоги

Сжатые логи

zgrep читает gzip на лету, распаковывать не нужно. Для xz и bzip2 есть xzgrep и bzgrep.

zgrep -a 'ERROR' /var/log/syslog.*.gz

Рекурсивно, но без бинарного мусора

-I пропускает бинарные файлы. Без него grep находит совпадение в каком-нибудь core-дампе и печатает Binary file matches, а иногда и ломает терминал.

grep -rIn 'connection refused' /var/log 2>/dev/null

Осторожно. Рекурсивный обход /var/log под пользователем без прав завалит вывод сообщениями об отказе в доступе. Отсюда 2>/dev/null — но при отладке его лучше убрать, чтобы видеть, куда grep не дошёл.

Диапазон времени

Вырезать промежуток

Если формат времени в начале строки лексикографически сортируем, работает sed с диапазоном шаблонов: от первого совпадения до первого совпадения со вторым.

sed -n '/2026-08-30T09:1/,/2026-08-30T09:3/p' app.log

Для ISO-8601 это работает всегда. Для формата nginx с квадратными скобками и месяцем словом — нет, там придётся идти через awk и разбор поля.

var-log.online — личные заметки по администрированию. Примеры проверены на Debian и Ubuntu.