lnav — супернедооценённый инструмент для работы с логами

1af47da8133b26311cc98b2ab973f775.png

Доброго дня. Это мой первый пост на хабре, поэтому не будьте особо строги к нему.

В мире разработки, системного администрирования и DevOps не смотря на то, что давно существуют и заняли свою нишу инструменты, связанные с централизованным сбором, визуализацией и анализом логов (graylog, ELK/EFK, loki, loggly и другие), всё ещё существует необходимость периодически взять шашку в руки и поработать со старыми/добрыми (а может быть и не очень добрыми) текстовыми логами. За 21 год своей деятельности я успел побыть системным администратором, DevOps инженером, разработчиком, CTO и системным аналитиком, но необходимость периодической работы с логами неизменно присутствовала в том или ином виде всегда. Это может быть разбор вывода нового сервиса или контейнера на машине разработчика, что-то, что ещё не успели завести (или сознательно по каким-либо причинам не завели) на централизованную систему сбора логов или, например, сервис, временно включенный в режиме debug для поиска причин проблемы. Ситуаций бывает много и ситуации бывают разные, а текстовые логи были, есть и ещё долго будут с нами.

Все, кто как-либо связан с DevOps знают про такие утилиты как more, less, tail, head, grep, sed, awk (а кто-то и ещё десяток более специфичных) и при необходимости их используют, но из тех, с кем я общался, никто не подтвердил мне, что знает про lnav. Я и сам не знал и искал нечто подобное более десяти лет. lnav — это не просто швейцарский армейский нож в мире работы с логами, а целый космический корабль, на котором можно улететь в соседнюю галактику. Мой мир разделился на «до» и «после» знакомства с этой утилитой. Там, где раньше требовались часы, а то и десятки часов на анализ логов, теперь хватает считанных минут.

Кратко об основных возможностях lnav.

  1. Позитивные и негативные фильтры: lnav предоставляет возможность включать и отключать (в том числе временно) фильтры, позволяя вам сосредоточиться только на нужной информации. Позитивные фильтры находят соответствующие записи, а негативные исключают ненужные, причём тут же можно видеть, сколько строк попало под фильтр и отображается в текущий момент. Естественно, поддерживаются регулярные выражения. Т.е. можно например, быстро найти все залогированные запросы в БД, время выполнения которых превышало определённое количество секунд .

  2. Удобная навигация: Утилита предлагает интуитивно понятный интерфейс с возможностью навигации в стиле VIM. Работают HJKL, переход в начало и конец по gg и G и некоторые другие возможности. Можно легко перемещаться к следующей (e) или предыдущей (E) ошибке, либо к тому, что lnav считает ошибкой и т.д. Возможность быстрого перехода к нужным блокам информации значительно ускоряет процесс работы.

  3. Подсветка синтаксиса и темизация: Подсветка синтаксиса делает логи более читаемыми, а возможность настроить тему позволяет адаптировать интерфейс под ваши предпочтения. Это особенно важно при работе с большими файлами, где детали могут легко ускользнуть из-за ненадлежащего оформления. Кто пытался отгрепать лог в несколько миллионов SQL запросов — поймёт и оценит. Также lnav умеет делать prettify (да, я всё ещё не знаю, как этот термин правильно перевести на русский) для xml и json.

    3edcd048b8e9ce6df4017fdf4cbf99b1.png
  4. График статистики: lnav позволяет выводить график статистики поступления записей в лог на единицу времени. Длина заполненной строки графика показывает количество строк за единицу времени относительно соседних строк и может иметь до трёх участков разного цвета: серый для нормальных записей, жёлтый для warning записей и красный для error записей. Это позволяет быстро визуализировать состояние системы и понять, когда в вашей системе что-то пошло не так. Т.е. вы сразу увидите, в какой точке резко выросло количество записей с ошибками, даже если их абсолютное количество составляет менее сотни на несколько десятков/сотен тысяч нормальных записей.

    c2cdbe4415c91ac311384198f1a8bfa7.png
  5. Определение логлевела: Утилита позволяет явно указывать логлевел для отображения, что помогает сосредоточиться на наиболее критичных записях и не отвлекаться на менее значимые.

  6. Множественные форматы логов: lnav поддерживает одновременное отображение сразу нескольких файлов логов различного формата (да-да, с индивидуальной для каждого формата подсветкой синтаксиса), что упрощает процесс анализа информации из различных источников и ведет к более полному пониманию происходящего.

    c4b572a8bec225fddaf7d33a4a94d2d6.png
  7. Внутренний SQL и разбиение по полям: Интересное и, возможно, спорное решение, но lnav переводит весь лог в SQLite базу, которую хранит в оперативной памяти. Это позволяет вам использовать различные части записи в логе как отдельные поля и делать sql запросы к данным ваших логов.

    SELECT c_ip, count(*), sum(sc_bytes) AS total FROM access_log GROUP BY c_ip ORDER BY total DESC;

    13590bd7afb19c56f5a0a25d510a5452.png
  8. Работа с залогированными SQL запросами: При фильтрации lnav анализирует запросы SQL и выводит все строки, которые соответствуют фильтру, даже если запрос состоит из нескольких строк. Это бесценная возможность. Т.е. введя в фильтр что-то вроде «uid=123» вы получите полные записи и с однострочными запросами и с теми, где это встретилось на 105-й строке запроса. Естественно, место вхождения будет подсвечено.

  9. Объединение записей по времени: Даже если форматы времени в логах различны, lnav попытается их интерпретировать и отобразит записи на единой временной шкале. Это позволяет видеть чередование строк из различных файлов по мере их поступления, что улучшает общую картину происходящего и позволяет обнаруживать взаимосвязи между событиями.

    1dd9b8f75b047bafbfc6733703c3d920.png
  10. Экспорт данных: После применения всех необходимых фильтров у вас есть возможность выделить блок строк, в том числе включающий данные из разных файлов и экспортировать эти данные в новый файл в формате текста, JSON или CSV. Это существенно упрощает подготовку отчетов и дальнейший анализ. В том числе вы можете выделить нужные для экспорта данные не одним блоком, а несколькими.

  11. Создание собственных форматов лога: Вы можете использовать специальный синтаксис, чтобы описать свой формат лога для разделения его по полям. Это даёт возможность более продуктивного анализа в будущем, поскольку вы сможете настроить lnav под специфические требования вашего конкретного проекта. Причём можно как создать формат с нуля, так и наследовать поля какого-то уже описанного формата.

    27dc012228ad49e88c6f3d03d7e0f4b2.png
  12. Закладки и дополнительные возможности: lnav позволяет создавать закладки, что помогает быстро возвращаться к нужным участкам данных по аналогии с тем, как это работает в vim.

  13. Возможность неинтерактивной работы с 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

  14. Сохранение и загрузка сессий: в lnav можно сохранять сессии. Это позволяет сохранить текущее состояние просмотра логов, включая примененные фильтры, аннотации и все выполненные действия.

    Сохранение сессии: :save-session имя_сессии.lnav

    Загрузка ранее сохранённой сессии: :load-session имя_сессии.lnav

  15. Работа с пайпами: Если необходимо, то можно пользоваться пайпами, например: tail -n 1000 -f somefile.log | lnav.

Больше информации можно получить в официальной документации.

Ложки дёгтя

Не бывает инструментов, состоящих из одних достоинств, поэтому ниже о выявленных мною недостатках:

  • Так как лог полностью загружается в оперативную память, то мы ограничены объёмом этой памяти. Если у вас в текущий момент недостаток свободной оперативной памяти, то вероятно, будет плохой идеей открывать на боевом сервере в lnav несколько десятков логов по гигабайту каждый. При работе с большим количеством логов следите за оперативной памятью или выгружайте логи на локальную машину.

  • Из-за того, что содержимое лога полностью переводится в SQLite, открытие больших объёмов логов может занимать существенное время на системах со слабым CPU.

  • Более высокий порог входа. «Он вам не grep», одних знаний regex тут будет явно недостаточно, если вы собираетесь использовать lnav на полную катушку.

  • Иногда по необъяснимым причинам особенно на больших объёмах данных lnav может упасть. К сожалению, такое периодически происходит.

Заключение

На мой взгляд преимущества lnav явно превышают недостатки. lnav это мощный и универсальный инструмент, который значительно упрощает процесс анализа логов. Совокупность его возможностей делает его незаменимым помощником для всех, кому приходится иметь дело с логами. За те годы, что я использую lnav, он стал обязательным инструментом на каждом моем хосте — как домашнем, так и рабочем. Усилия, затраченные на изучение lnav окупились стократно. Если вы не слышали об этом инструменте, настоятельно рекомендую вам с ним ознакомиться.

Вы можете узнать больше о lnav на официальном сайте.

© Habrahabr.ru