Руководство для начинающих по анализу логов в Linux с помощью команды Journalctl

Автор: | 31/08/2023

Руководство для начинающих по использованию команд Journalctl для просмотра, фильтрации и анализа журнала логов в Linux.

systemd используется по умолчанию в большинстве основных дистрибутивов Linux. Одной из основных особенностей systemd является способ сбора логов и инструменты для их анализа.

В традиционной системе SysVinit имеется системный журнал (syslog), в котором логи хранятся в виде текстовых файлов. Чтение и анализ этих файлов требует использования find, grep, cut и многих других команд.

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

Что такое journald? Что такое journalctl?

Journald — это демон из systemd, который собирает логи из различных источников логов, таких как системный журнал.

Journalctl — это инструмент командной строки, который позволяет вам взаимодействовать с журналом логов.

С помощью Journalctl вы можете читать логи, отслеживать логи в режиме реального времени, фильтровать логи по времени, обслуживанию, серьезности и другим параметрам.

В этом уроке я покажу вам, как использовать journalctl для чтения, мониторинга и анализа логов в Linux.

Проверьте, включен ли журнал логов в вашей системе

Некоторые дистрибутивы Linux, особенно настольные, по умолчанию не включают журнал логов.

По умолчанию журнал логов Journald располагается в /var/log/journal каталоге. Вы должны убедиться, что этот каталог существует. Если нет, создайте его сами.

Затем в файле /etc/systemd/journald.conf убедитесь, что Storage установлено значение auto или persistent.

В файле Journald.conf показаны значения по умолчанию. Таким образом, даже если перед записями стоит #, это означает, что используются настройки по умолчанию. Если вы хотите что-то изменить, удалите # из этой строки.

Использование команд journalctl

Чтение и поиск в журнале логов с помощью Journalctl

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

journalctl

Journalctl использует less нижнюю часть, чтобы показать вам журнал. Это означает, что вы можете использовать те же клавиши для перемещения по логам, что и с помощью команды less .

Если вы этого не помните, вот краткое напоминание:

КлючОписание
ArrowПереместиться на одну строку
SpaceПерейти на одну страницу вниз
bПерейти на одну страницу вверх
gПерейти к первой строке
GПерейти к последней строке
100gПерейти на 100-ю строку
/stringПоиск строки с текущей позиции
n/NПерейти к следующему или предыдущему совпадению поиска
qВыйти из журналов

Если вы не хотите, чтобы логи отображались в менее похожем режиме просмотра, вы можете использовать этот --no-pager флаг. Это отобразит целые логи прямо на экране.

journalctl --no-pager

Это не очень полезно и заполнит ваш экран, если у вас огромное количество логов.

Показать логи в обратном хронологическом порядке

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

Если вы хотите сначала просмотреть последние логи, вы можете отобразить журнал логов в обратном порядке с помощью опции -r:

journalctl -r

Он по-прежнему использует команду less, например view. Итак, нажмите q для выхода из режима просмотра журнала.

Отображать только N последних строк журнала логов

Вместо отображения всех логов вы можете выбрать отображение только определенного количества строк из журнала, используя эту -n опцию.

Например, команда ниже отобразит последние 25 строк журнала:

journalctl -n 25

Показывать журнал логов в режиме реального времени

Просмотр последних логов — это одно. Если вы хотите просматривать логи в реальном времени, вы можете использовать опцию -f команды Journalctl:

journalctl -f

Как и опция -f команды Tail , будет отображать логи в режиме реального времени в следующем режиме.

Используйте команду Ctrl+C, чтобы выйти из режима просмотра в реальном времени.

Показывать логи по времени UTC

По умолчанию журнал логов отображается по местному времени вашей системы. Если время вашей системы установлено на время, отличное от UTC, и вы хотите видеть логи в формате UTC, вы можете сделать это, используя этот --utc флаг.

journalctl --utc

Показывать только сообщения ядра с -k

Журнал systemd аккумулирует логи из разных источников. Если вы просто хотите просмотреть журналы ядра Linux, вы можете использовать опцию -k.

journalctl -k

Совет: используйте sudo, чтобы просмотреть все журналы логов.

Systemd заботится о том, какие логи показывать какому пользователю.

Он может отображать некоторые логи, но не все, если вы обычный пользователь:

abhishek@linuxhandbook:~$ journalctl -u ssh
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
-- Logs begin at Mon 2020-06-22 12:05:47 UTC, end at Tue 2020-07-14 11:59:29 UTC. --
-- No entries --

Если вам нужен доступ ко всем логам, вам следует использовать sudoесли вы являетесь пользователем sudo :

sudo journalctl -u ssh

Показать сообщения из определенного сеанса загрузки

Это отличная особенность jounrald. Команда journalctl позволяет получить доступ к логам, принадлежащим определенному сеансу загрузки, с помощью опции -b.

Вы можете перечислить все сеансы загрузки с помощью --list-boots флага.

journalctl --list-boots

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

 -5 513008ead8464c23aab732a2feed5277 Sun 2020-07-12 20:43:38 IST—Sun 2020-07-12 22:40:02 IST
  -4 caff16e3f46a4479b5287fb9e294f610 Mon 2020-07-13 07:36:04 IST—Mon 2020-07-13 19:13:44 IST
  -3 5665f41cc50a4dec9955efacc2596d68 Mon 2020-07-13 20:30:55 IST—Mon 2020-07-13 22:20:34 IST
  -2 c7d17407b0bd476a930af503f64b6006 Tue 2020-07-14 07:58:41 IST—Tue 2020-07-14 18:50:04 IST
  -1 7ab5e04518ec455abe0e2c86fdaa46fa Tue 2020-07-14 21:19:27 IST—Tue 2020-07-14 22:42:11 IST
   0 91856e86d4ee4e828717913deb288568 Wed 2020-07-15 08:11:51 IST—Wed 2020-07-15 17:14:10 IST

Сеанс загрузки 0 — это текущие сеансы загрузки. Сеанс загрузки -1 — это последний загруженный сеанс и так далее.

journalctl -b -2

Представьте себе, что вы пытаетесь сделать это в журнале старой системы syslog!

Вы не можете получить только логи загрузки, подобные тем, которые вы видите в файле /var/log/boot.log. Однако логи загрузки всегда находятся в начале журнала логов, если вы находитесь в режиме сеанса загрузки.

Фильтрация журнала логов для конкретной службы systemd

Фильтрация — сильная сторона журналов логов. Вы можете фильтровать логи на основе сервисов systemd.

journalctl -u service_name

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

journalctl -u ssh

Конечно, вам нужно знать имя службы systemd.

Фильтрация логов за определенный интервал времени

Это еще один пример возможности фильтрации строк в журнале логов. Вы можете фильтровать логи за определенный период времени, и это можно сделать разными способами.

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

journalctl --since=yesterday --until=now

Вы также можете указать дату или комбинацию даты и времени:

journalctl --since "2020-07-10"

Вы также можете указать период времени с датами и временем:

journalctl --since "2020-07-10 15:10:00" --until "2020-07-12"

Время начинается в 00:00:00 и определяет день и дату.

Вы также можете использовать относительное время, например -1 час 20 минут, чтобы указать 1 час 20 минут в прошлом.

Фильтрация логов на основе UID, GID и PID

Если вы устраняете проблему, вы можете проверить логи определенного процесса, используя его PID.

Журнал логов также можно фильтровать по идентификатору пользователя (UID), идентификатору группы (GID) и идентификатору процесса (PID). Ниже приведен пример:

journalctl _PID=1234

Совет: Объедините несколько параметров для более индивидуального просмотра логов.

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

Например, если вы хотите видеть только вчерашние логи SSH с метками времени UTC, вы можете использовать:

sudo journalctl -u ssh --since=yesterday --utc

Другое распространенное использование — фильтрация логов на основе сеансов загрузки. Если вы хотите видеть только логи SSH в текущем сеансе, вы можете использовать:

sudo journalctl -u ssh -b0

Возможности безграничны, и вы можете комбинировать варианты в зависимости от ваших потребностей.

Использование Journalctl -xe для просмотра нескольких последних логов

Вы часто встретите людей, предлагающих использовать journalctl -xe команду.

  • -e: перейти в конец журнала логов.
  • -x: Показать дополнительную информацию о записях логов(если доступно).

Некоторые записи логов содержат дополнительную информацию, которая не отображается при обычном просмотре журнала. Использование -x опции может отображать такую ​​информацию.

То, что вы видите как одну строку, выглядит так:

Jul 09 16:33:40 itsfoss systemd[1]: Started Run anacron jobs.

Он может отображать дополнительную информацию следующим образом:

Jul 09 16:33:40 itsfoss systemd[1]: Started Run anacron jobs.
-- Subject: A start job for unit anacron.service has finished successfully
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- A start job for unit anacron.service has finished successfully.
-- 
-- The job identifier is 3702.

Дополнительная информация помогает объяснить контекст ошибки или события журнала и возможные решения.

Показывать только ошибки в логах с помощью Journalctl

Чтобы показать все ошибки в текущем сеансе, вы можете использовать:

journalctl -p 3 -xb
  • -p 3: фильтровать журналы по приоритету 3 (что является ошибкой)
  • -x: предоставляет дополнительную информацию в журнале (если имеется)
  • -b: с момента последней загрузки (текущий сеанс)

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

ПриоритетКод
0emerg
1alert
2crit
3err
4warning
5notice
6info
7debug

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

journalctl -p 4..6 -b0

Вы также могли бы использовать warning..info в приведенной выше команде вместо 4..6.

Проверьте, сколько места на диске занимают логи

Journald собирает логи из различных источников и хранит логи разных уровней, включая логи отладки. Поверьте мне, хотя сохранение логов помогает при анализе и аудите, они могут занимать значительный объем дискового пространства.

Вы можете проверить, сколько места на диске занимают журнал логов с помощью этой команды Journalctl:

journalctl --disk-usage

Вы можете быть удивлены (или шокированы), когда увидите результат:

abhishek@linuxhandbook:~$ journalctl --disk-usage 
Archived and active journals take up 2.8G in the file system.

2,8 ГБ? Это много. Возможно, вы захотите очистить журналы журнала .

Наслаждайтесь анализом логов с помощью команды Journalctl

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

https://linuxhandbook.com/journalctl-command/