Обычный разбор инцидента — это tail -f в одном терминале, grep в другом и попытка держать в голове, какая строка из syslog произошла раньше строки из лога nginx. lnav решает это иначе: скармливаешь ему сразу несколько файлов, а он сам определяет формат каждого (syslog, access-логи Apache/nginx, strace, просто “timestamp + сообщение”) и склеивает всё в единую ленту, отсортированную по времени, вне зависимости от того, из какого файла строка пришла.

Запускается без параметров поиска формата — просто:

lnav /var/log/syslog /var/log/nginx/access.log

Дальше это уже интерактивный TUI: / для поиска, :filter-in/:filter-out для отсева по regex, сочетания как в less. Но отдельная причина держать lnav под рукой — встроенный SQL-движок. Для распознанных форматов lnav создаёт виртуальные таблицы, и по ним можно писать обычный SELECT прямо из интерфейса командой, начинающейся с ;:

;SELECT cs_uri_stem, count(*) AS total
   FROM access_log
   GROUP BY cs_uri_stem
   ORDER BY total DESC
   LIMIT 10;

Это топ-10 самых запрашиваемых URL из access-лога без единого вызова awk или sort | uniq -c. Отдельная команда ;.msgformats сразу показывает, какие форматы сообщений lnav обнаружил в открытых файлах и сколько строк под каждый подпадает — удобно, когда не уверен, что lnav действительно понял структуру нестандартного лога.

Для разовой диагностики продакшена, где логов десяток файлов с разными источниками времени, lnav экономит реально много телодвижений — не нужно вручную сортировать и мержить, это его базовая работа.

#linux #logs