Как стать автором
Обновить

lazyjournal — ленивый интерфейс для поиска и анализа логов

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров3.7K

Всем привет! Я уже писал статью о различных способах, которые мне приходилось использовать для чтения логов, и к какому решению в итоге пришел. Хотя прошло не так много времени, с тех пор приложение не переставало развиваться. Узнав о том, что на Хабре проходит сезон Open source, мне показалось это отличным поводом подчеркнуть, что именно стало причиной для создания данного инструмента, а также рассказать немного подробнее про основные и новые функции.

Почему терминальный интерфейс?

На сегодняшний день существует очень много как встроенных, так и сторонних консольных утилит (команд), а в свою очередь для них параметров (флагов/ключей), которые порой становится сложно запомнить, и как следствие, все чаще прибегать к заметкам. Пожалуй, самым большим минусом, является бесчисленное количество повторного использования этих команд, для достижения конечного результата.

TUI (Text-based User Interface) - это интерфейс, который автоматизирует и визуализирует процесс использования тех самых привычных команд (своего рода frontend). По своей природе, все TUI приложения являются Open Source проектами, при этом обычно не требуют сложной установки, и чаще всего адаптированы для разных платформ и систем. Большинство из них написаны на Rust или Go, хотя бы потому, что на этих языках больше всего соответствующих и развивающихся фреймворков (в отличии, от того же JavaScript, где присутствует только одна прекрасная, но устаревшая библиотека Blessed, хотя и на ней базирует очень много популярных TUI приложений), а на выходе мы имеем один исполняемый файл.

Каждый пользователь Linux уже пользовался подобным интерфейсом, например, для управления процессами с помощью top или htop, хотя, стоит отметить, что существует как минимум десяток не менее функциональных альтернатив (например, bottom или zenith). Если вы используете систему контейнеризации Docker, то с высокой долей вероятности, уже работали с ctop или lazydocker. Для Podman есть podman-tui, для Kubernetes k9s, а количество звезд и запросов issue на GitHub доказывает, что такие инструменты пользуются большой популярностью. Именно lazydocker стал идейным вдохновителем на создание lazyjournal.

Почему lazyjournal?

Работа с журналами в терминале требует запуска различных команд, таких как journalctl (утилита для чтения журналов из подсистемы journald), docker logstailless, а также использования find для поиска, и grep или других утилит для фильтрации вывода. LazyJournal упрощает этот процесс, предлагая интуитивно понятный интерфейс, который ускоряет анализ логов.

Помимо этого, для анализа любых журналов, удобнее использовать покраску вывода, например, существует отличный инструмент для командной строки — tailspin. В lazyjournal реализована встроенная подсветка по ключевым словам (ошибки, успех, предупреждения, действия), а также процессов UNIX, путей в файловой системы, URL, IP-адресов и других числовых значений.

Тестовый файл для демонстрации покраски вывода ключевых слов.
Тестовый файл для демонстрации покраски вывода ключевых слов.

Источники логов

Будучи работая системным администратором, мне всегда хотелось иметь под рукой такой инструмент, где будет возможно централизованно производить поиск и быстро просматривать их содержимое на предмет нужной информации. Основной причиной создания инструмента, как и отличие его от аналогов заключается в том, что он обеспечивает быстрый поиск журналов во всех доступных источниках с использованием ключевых слов. Списки журналов делятся на три категории, а каждое окно со списком поддерживает переключение между дополнительными списками, с помощью клавиш со стрелочками влево и вправо.

  • Списки журналов из journald (через journalctl):

Список всех юнитов со статус их работы, системные или пользовательские журналы и загрузки ядра.
Список всех юнитов со статус их работы, системные или пользовательские журналы и загрузки ядра.

Из новых функций, добавлена поддержка auditd. Это демон аудита, разработанный компанией Red Hat, который включен в ядро Linux и является универсальным инструментом для мониторинга событий в операционной системе (на Хабре есть отличная статья по настройке auditd для обнаружения и расследования инцидентов). Читать журналы аудита напрямую из файловой системы не очень удобно, т.к. записи идут вперемешку для всех правил, поэтому, для удобства фильтрации присутствует встроенная утилита ausearch. В интерфейсе lazyjournal присутствует возможность вывести список всех правил для фильтрации вывода по уникальному ключу, а также их просмотр в формате interpret, который расшифровывает числовые и кодированные значения (такие, как UID и системные вызовы) в человекочитаемый формат. Так что, хотя бы на этапе отладки правил, это может стать удобным решением.

Пример фильтрация правил аудита по ключу hosts-changes.
Пример фильтрация правил аудита по ключу hosts-changes.
  • Журналы в файловой системе (список доступных файлов с расширением .log):

Списки журналов в файловой системе.
Списки журналов в файловой системе.

Для разграничения по директориям, присутствует 4 списка с журналами из /var/log, /opt, всех домашних каталогов пользователей (home в Linux и Users для macOS) и файловых журналов дескрипторов, используемых процессами в текущий момент времени. Поддерживается просмотр архивных журналов, усеченных в процессе ротации (в форматах gzxz и bz2), Packet Capture (pcap/pcapng формат) и Apple System Log (aslформат).

  • Журналы контейнеров Docker, Podman и Kubernetes pods:

Вывод журнала контейнера jenkins-agent.
Вывод журнала контейнера jenkins-agent.

Хотя изначально инструмент планировался только для journalctl и файловой системы, в процессе более активного использования контейнеров, я заметил, что большинство инструментов отображают журнал только с момента запуска системы контейнеризации (например, Dozzle) или самой программы (например, lazydocker). По этой причине, реализовано два подхода чтения журналов, где для пользователей с правами к каталогу /var/lib/docker/containers, присутствует возможность доступа ко всей истории журнала с момента запуска контейнера. Также, поддерживается включение и отключение отображения временной метки (timestamp) и типа потока для каждого сообщения (stdout или stderr).

Фильтрация

Ключевым инструментом в вопросе анализа логов, является их фильтрация. lazyjournal поддерживает 4 таких режима:

  • По умолчанию — точный поиск с учетом регистра.

  • Fuzzy (похож на fzf) — неточный поиск, без учета регистра (поиск всех фраз, разделенных пробелом в любом месте строки).

Пример фильтрации вывода из журнала auth.log.
Пример фильтрации вывода из журнала auth.log.
  • Regex (альтернатива grep) — поиск с поддержкой регулярных выражений, на базе библиотеки regexp. По умолчанию, без учета регистра. В случае возникновения ошибки синтаксиса регулярного выражения, поле ввода будет выделено красным цветом.

  • Timestamp — фильтрация по дате и времени (с и/или до) для логов из journald, контейнеров docker и podman. Данный режим влияет на загрузку журнала, что ускоряет производительность, а также позволяет совмещать их с другими режимами фильтрации.

Фильтрация журнала cron по дате и времени.
Фильтрация журнала cron по дате и времени.

Установка и использование

Исполняемые файлы для разных платформ доступны на странице релизов. Также присутствует скрипт, который автоматизирует процесс установки бинарного файла из репозитория GitHub:

curl -sS https://raw.githubusercontent.com/Lifailon/lazyjournal/main/install.sh | bash

Из интересного для меня опыта, несколько пользователей GitHub самостоятельно загрузили приложение в популярные менеджеры пакетов, и поддерживают его обновление. Поэтому, для установки вы также можете использовать Homebrew, Conda или AUR.

Помимо терминального интерфейса, поддерживается подсветка и фильтрация вывода в режиме командной строки:

# Создаем псевдоним для команды, который можно добавить в профиль
alias lj=lazyjournal # >> $HOME/.bashrc

# Передаем текст через pipe на вход lazyjournal, для покраски вывода
cat /var/log/syslog | lj -c

# Фильтрация в режиме неточного поиска, по ключевому слову "error"
cat /var/log/syslog | lj -f "error"

# Фильтрация с поддержкой регулярных выражений (cli для regexp)
cat /var/log/syslog | lj -r "failed|fatal|crash"

Управление интерфейсом осуществляется с помощью сочетаний клавиш, что стандартно для TUI, а также, поддерживается управление мишью для выбора окна, журнала, скроллинга списков и вывода. Список всех доступных комбинаций клавиш можно получить в окне справки, по нажатию F1:

Получение справки.
Получение справки.

Кроме Linux, присутствует поддержка macOS, FreeBSD, OpenBSD и Windows для доступа к файловым журналам и контейнерам (а также частичная поддержка Windows Event Logs). Модульные тесты охватывают все основные функции и работу интерфейса. Отчет о тестовом покрытии с использованием GitHub Actions доступен на странице Wiki.

Другие инструменты

Мне также хотелось бы выделить еще два инструмента, которые являются отличными решениями для просмотра логов в терминале:

  • TooLong - терминальное приложение для просмотра и объединения файлов журналов, написанное на Python. На вход может принимать любое количество разных источников журналов (не только файлов), поддерживает вывод в режиме реального времени, навигацию и удобный поиск.

  • Lnav - просмотрщик лог-файлов для терминала. Похож на TooLong, но куда более популярный и функциональный, хотя на мой взгляд, уступает в плавности и скорости работы. Инструмент достаточно пожилой (первый коммит от 2009 года) и активно поддерживаемый по сегодняшний день.

Заключение

Существует много специализированных систем для управления логами, такие как ELK, GrayLog или Loki, но большинство из них требуют настройки серверной части и установки агентов на конечных машинах. lazyjournal не является их заменой, скорее, это простая и быстрая альтернатива, которая в первую очередь будет полезна для домашних сред, системных администраторов и технических специалистов, регулярно работающих с логами в терминале. При использовании конфигурации rsyslog (на Хабре есть много статей по его настройке), вы сможете искать и просматривать журналы из удаленных систем в рамках одного интерфейса.

Хочу также отметить, что по професси не являюсь разработчиком, для меня это остается только хобби, и соответственно могут наблюдаться "плохие практики", поэтому у меня есть много идей по оптимизации производительности и расширению функциональности интерфейса. Уверен, что большинство разработчиков, которые выкладывали свой код на GitHub или другие публичные площадки, сталкивались с проблемой в популизации своих решений, по этой причине для меня важна любая обратная связь с целью развития данного проекта! Если у вас возникнут проблемы в работе интерфейса или предложения по улучшению, пожалуйста, откройте запрос в разделе Issue.

Теги:
Хабы:
+14
Комментарии14

Публикации

Работа

Go разработчик
78 вакансий

Ближайшие события