lnav — супернедооценённый инструмент для работы с логами
Доброго дня. Это мой первый пост на хабре, поэтому не будьте особо строги к нему.
В мире разработки, системного администрирования и DevOps не смотря на то, что давно существуют и заняли свою нишу инструменты, связанные с централизованным сбором, визуализацией и анализом логов (graylog, ELK/EFK, loki, loggly и другие), всё ещё существует необходимость периодически взять шашку в руки и поработать со старыми/добрыми (а может быть и не очень добрыми) текстовыми логами. За 21 год своей деятельности я успел побыть системным администратором, DevOps инженером, разработчиком, CTO и системным аналитиком, но необходимость периодической работы с логами неизменно присутствовала в том или ином виде всегда. Это может быть разбор вывода нового сервиса или контейнера на машине разработчика, что-то, что ещё не успели завести (или сознательно по каким-либо причинам не завели) на централизованную систему сбора логов или, например, сервис, временно включенный в режиме debug для поиска причин проблемы. Ситуаций бывает много и ситуации бывают разные, а текстовые логи были, есть и ещё долго будут с нами.
Все, кто как-либо связан с DevOps знают про такие утилиты как more, less, tail, head, grep, sed, awk (а кто-то и ещё десяток более специфичных) и при необходимости их используют, но из тех, с кем я общался, никто не подтвердил мне, что знает про lnav. Я и сам не знал и искал нечто подобное более десяти лет. lnav — это не просто швейцарский армейский нож в мире работы с логами, а целый космический корабль, на котором можно улететь в соседнюю галактику. Мой мир разделился на «до» и «после» знакомства с этой утилитой. Там, где раньше требовались часы, а то и десятки часов на анализ логов, теперь хватает считанных минут.
Кратко об основных возможностях lnav.
Позитивные и негативные фильтры:
lnav
предоставляет возможность включать и отключать (в том числе временно) фильтры, позволяя вам сосредоточиться только на нужной информации. Позитивные фильтры находят соответствующие записи, а негативные исключают ненужные, причём тут же можно видеть, сколько строк попало под фильтр и отображается в текущий момент. Естественно, поддерживаются регулярные выражения. Т.е. можно например, быстро найти все залогированные запросы в БД, время выполнения которых превышало определённое количество секунд .Удобная навигация: Утилита предлагает интуитивно понятный интерфейс с возможностью навигации в стиле VIM. Работают HJKL, переход в начало и конец по gg и G и некоторые другие возможности. Можно легко перемещаться к следующей (e) или предыдущей (E) ошибке, либо к тому, что
lnav
считает ошибкой и т.д. Возможность быстрого перехода к нужным блокам информации значительно ускоряет процесс работы.Подсветка синтаксиса и темизация: Подсветка синтаксиса делает логи более читаемыми, а возможность настроить тему позволяет адаптировать интерфейс под ваши предпочтения. Это особенно важно при работе с большими файлами, где детали могут легко ускользнуть из-за ненадлежащего оформления. Кто пытался отгрепать лог в несколько миллионов SQL запросов — поймёт и оценит. Также lnav умеет делать prettify (да, я всё ещё не знаю, как этот термин правильно перевести на русский) для xml и json.
График статистики:
lnav
позволяет выводить график статистики поступления записей в лог на единицу времени. Длина заполненной строки графика показывает количество строк за единицу времени относительно соседних строк и может иметь до трёх участков разного цвета: серый для нормальных записей, жёлтый для warning записей и красный для error записей. Это позволяет быстро визуализировать состояние системы и понять, когда в вашей системе что-то пошло не так. Т.е. вы сразу увидите, в какой точке резко выросло количество записей с ошибками, даже если их абсолютное количество составляет менее сотни на несколько десятков/сотен тысяч нормальных записей.Определение логлевела: Утилита позволяет явно указывать логлевел для отображения, что помогает сосредоточиться на наиболее критичных записях и не отвлекаться на менее значимые.
Множественные форматы логов:
lnav
поддерживает одновременное отображение сразу нескольких файлов логов различного формата (да-да, с индивидуальной для каждого формата подсветкой синтаксиса), что упрощает процесс анализа информации из различных источников и ведет к более полному пониманию происходящего.Внутренний SQL и разбиение по полям: Интересное и, возможно, спорное решение, но lnav переводит весь лог в SQLite базу, которую хранит в оперативной памяти. Это позволяет вам использовать различные части записи в логе как отдельные поля и делать sql запросы к данным ваших логов.
SELECT c_ip, count(*), sum(sc_bytes) AS total FROM access_log GROUP BY c_ip ORDER BY total DESC;
Работа с залогированными SQL запросами: При фильтрации
lnav
анализирует запросы SQL и выводит все строки, которые соответствуют фильтру, даже если запрос состоит из нескольких строк. Это бесценная возможность. Т.е. введя в фильтр что-то вроде «uid=123» вы получите полные записи и с однострочными запросами и с теми, где это встретилось на 105-й строке запроса. Естественно, место вхождения будет подсвечено.Объединение записей по времени: Даже если форматы времени в логах различны,
lnav
попытается их интерпретировать и отобразит записи на единой временной шкале. Это позволяет видеть чередование строк из различных файлов по мере их поступления, что улучшает общую картину происходящего и позволяет обнаруживать взаимосвязи между событиями.Экспорт данных: После применения всех необходимых фильтров у вас есть возможность выделить блок строк, в том числе включающий данные из разных файлов и экспортировать эти данные в новый файл в формате текста, JSON или CSV. Это существенно упрощает подготовку отчетов и дальнейший анализ. В том числе вы можете выделить нужные для экспорта данные не одним блоком, а несколькими.
Создание собственных форматов лога: Вы можете использовать специальный синтаксис, чтобы описать свой формат лога для разделения его по полям. Это даёт возможность более продуктивного анализа в будущем, поскольку вы сможете настроить
lnav
под специфические требования вашего конкретного проекта. Причём можно как создать формат с нуля, так и наследовать поля какого-то уже описанного формата.Закладки и дополнительные возможности:
lnav
позволяет создавать закладки, что помогает быстро возвращаться к нужным участкам данных по аналогии с тем, как это работает в vim.Возможность неинтерактивной работы с lnav и создания скриптов для обработки данных: Одной из мощных возможностей lnav является возможность неинтерактивной работы, что позволяет вам писать собственные скрипты для автоматизации анализа логов и обработки данных. Это особенно полезно в тех случаях, когда требуется обрабатывать большие объемы информации или выполнять регулярные задачи.
$ lnav -n \ -c ';SELECT c_ip, count(*) AS total FROM access_log GROUP BY c_ip ORDER BY total DESC LIMIT 10' \ -c ':write-csv-to -' \ access.log c_ip,total 10.208.110.176,2989570 10.178.4.102,11183 10.32.110.197,2020 10.29.165.250,443
Сохранение и загрузка сессий: в lnav можно сохранять сессии. Это позволяет сохранить текущее состояние просмотра логов, включая примененные фильтры, аннотации и все выполненные действия.
Сохранение сессии:
:save-session имя_сессии.lnav
Загрузка ранее сохранённой сессии:
:load-session имя_сессии.lnav
Работа с пайпами: Если необходимо, то можно пользоваться пайпами, например: tail -n 1000 -f somefile.log | lnav.
Больше информации можно получить в официальной документации.
Ложки дёгтя
Не бывает инструментов, состоящих из одних достоинств, поэтому ниже о выявленных мною недостатках:
Так как лог полностью загружается в оперативную память, то мы ограничены объёмом этой памяти. Если у вас в текущий момент недостаток свободной оперативной памяти, то вероятно, будет плохой идеей открывать на боевом сервере в lnav несколько десятков логов по гигабайту каждый. При работе с большим количеством логов следите за оперативной памятью или выгружайте логи на локальную машину.
Из-за того, что содержимое лога полностью переводится в SQLite, открытие больших объёмов логов может занимать существенное время на системах со слабым CPU.
Более высокий порог входа. «Он вам не grep», одних знаний regex тут будет явно недостаточно, если вы собираетесь использовать lnav на полную катушку.
Иногда по необъяснимым причинам особенно на больших объёмах данных lnav может упасть. К сожалению, такое периодически происходит.
Заключение
На мой взгляд преимущества lnav явно превышают недостатки. lnav
это мощный и универсальный инструмент, который значительно упрощает процесс анализа логов. Совокупность его возможностей делает его незаменимым помощником для всех, кому приходится иметь дело с логами. За те годы, что я использую lnav
, он стал обязательным инструментом на каждом моем хосте — как домашнем, так и рабочем. Усилия, затраченные на изучение lnav
окупились стократно. Если вы не слышали об этом инструменте, настоятельно рекомендую вам с ним ознакомиться.
Вы можете узнать больше о lnav
на официальном сайте.