Руководство для начинающих по использованию команд 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
: с момента последней загрузки (текущий сеанс)
Вы также можете использовать другой уровень приоритета для получения логов отладки, предупреждений или даже критического уровня. В этой таблице перечислены все уровни приоритета.
Приоритет | Код |
0 | emerg |
1 | alert |
2 | crit |
3 | err |
4 | warning |
5 | notice |
6 | info |
7 | debug |
Вы также можете отображать логи различной степени серьезности. Например, если вы хотите просмотреть все логи предупреждений, уведомлений и информации текущего сеанса, вы можете использовать:
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, и я не могу описать их все. Я рекомендую прочитать его справочную страницу, если вы хотите получить более подробную информацию о нем.