Logs analysis

https://habr.com/ru/articles/749714/

journalctl - Работа со структурированными логами

Журнал событий, это компонент systemd, который захватывает сообщения Syslog, логи ядра, все события при инициализации системы (RAM, диск, boot, STDOUT/STDERR для всех сервисов), индексирует их и затем предоставляет удобной пользовательский интерфейс для поиска и фильтрации логов. Журнал (systemd journal) можно использовать вместе или вместо syslog или syslog-ng.

Утилита командной строки journalctl, если сравнивать ее с традиционным инструментами для работы с логами в UNIX (tail, grep, sed, awk) более широкие возможности.

Давайте рассмотрим основные возможности которые предоставляет журнал systemd и способы их применения.

Журнал systemd сохраняется на диск, поэтому все логи «переживают» перезагрузку системы. Посмотреть список с доступными загрузками:

journalctl --list-boots |head -n2

journalctl --list-boots |tail -n2

Команда journalctl –b покажет все логи для текущей загрузки. Если необходимы логи какого-то определенного периода, то нужно добавить в качестве аргумента номер загрузки:

journalctl -b -1

Для того, чтобы получить все логи для текущей загрузки в обратном хронологическом порядке:

journalctl -b --all --catalog --no-pager

Все логи за все время в одном файле:

journalctl --all --catalog --merge --no-pager

Текущая загрузка, только логи ядра:

Для того, чтобы можно было отслеживать логи в режиме реального времени (похоже на tail –f):

Просмотреть сколько места занимают журналы systemd на диске (/var/log/journal/):

Получить логи и метаданные:

Экспорт логов в файл:

Фильтрация логов

Можно фильтровать логи по приоритету (RFC 5424 6.2.1):

Вывести только логи c приоритетом error, critical и alert:

Логи только для определенного идентификатора:

journalctl можно использовать вместе с стандартными инструментами командной строки - grep, awk:

Для того, чтобы сократить время лучше использовать флаг -g или --grep:

Как и grep --grep «понимает» регулярные выражения:

Позволяет отфильтровывать логи по временным штампам, без grep, awk и sed. Не нужно запоминать сложные регулярные выражения:

Если у вас геораспределенная инфраструктура в разных часовых поясах, то journalctl поможет с разными часовыми поясами:

Журнал systemd сохраняет логи в структурированном формате:

Журнал systemd сохраняет логи в структурированном формате:

Или например посмотреть логи всех программ написанных на питоне:

JSON - новые возможности для автоматизации

journalctl умеет выводить логи в формате json – можно использовать утилиту jq для фильтрации сообщений:

Структурированные логи открывают широкие возможности для автоматизации. Больше не надо «хачить» пытаясь склеить sed, grep и awk в скриптах. Любой высокоуровневый язык программирования содержит модуль для работы с JSON.

В качестве наглядного примера можно представить себе сдающий сценарий: Приложение X записывает в журнал событий какие-то сообщения. Простая программа работающая в режиме демона Linux отслеживает события в журнале systemd. В случае появления какого-то определенного сообщения в журнале, программа следуя внутренней логике отправляет сообщение в шину данных (kafka, rabbitmq, NATS) или выполняет определенные операции в системе:

Код

Теперь в одной сессии терминала мы запускаем программу отслеживающую события в журнале:

А в другой сессии терминала эмулируем запись приложением X сообщений в журнал с помощью встроенной утилиты systemd-cat:

В данном случае для работы с журналом используется пакет "os/exec" – то есть мы выполняем системные команды, но можно воспользоваться одной из существующих библиотек:

https://github.com/coreos/go-systemd

Это простой пример использования структурированных логов журнала systemd. Возможности systemd гораздо шире – многие из них используются, например облачными провайдерами для построения отказоустойчивой инфраструктуры.

sos report - когда нужно найти иголку в стоге сена

https://github.com/sosreport/sos

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

Для таких сценариев как раз и предназначен sos report. Это унифицированный инструмент для сбора логов и диагностической информации. С помощью sos report можно создавать архив со всей необходимой информацией о системе – эти данные используются для анализа и поиска проблем в режиме оффлайн.

Установка sosreport:

Программа написана Python. Легко расширяется. Для sos report были написаны десятки плагинов:

профилей:

и пресетов:

Все это можно кастомизировать под определенный кейс.

Пример генерации репорта:

Созданный архив с логами можно забрать для дальнейшего анализа:

В зависимости от выбранного профиля и плагинов, в архиве может содержатся подробная диагностическая информация с выводами различных утилит и инструментов:

При генерации репорта, с помощью флагов --clean, --domains и --keywords можно обфусцирвоать (подчистить) полученный архив удалив всю конфиденциальную информацию.

Last updated

Was this helpful?