Поиск по сайту:

Управление сообщениями журнала в Systemd с помощью Journalctl [Подробное руководство]


Systemd — это современный менеджер систем и сервисов для систем Linux: замена демона инициализации, предназначенная для параллельного запуска процессов при загрузке системы. В настоящее время он поддерживается во многих текущих основных дистрибутивах, включая Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS и т. д.

Ранее мы объяснили историю «init» и «systemd»; где мы обсудили, что это за два демона, почему технически необходимо заменить «init» на «systemd», а также основные возможности systemd.

Одним из основных преимуществ systemd перед другими распространенными системами инициализации является поддержка централизованного управления системой и журналированием процессов с помощью журнала. В этой статье мы узнаем, как управлять сообщениями журнала и просматривать их в systemd с помощью команды journalctl в Linux.

Важно! Прежде чем двигаться дальше в этом руководстве, возможно, вам захочется узнать, как управлять службами и модулями Systemd с помощью команды Systemctl, а также создавать и запускать новые сервисные единицы в systemd с использованием сценариев оболочки в Linux. Однако, если вас устраивает все вышеперечисленное, продолжайте чтение.

Настройка Journald для сбора сообщений журнала в Systemd

journald — это демон, который собирает и записывает записи журнала со всей системы; По сути, это загрузочные сообщения, сообщения из ядра, системного журнала или различных приложений, и все сообщения хранятся в центральном месте — файле журнала.

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

Ниже приведен пример того, как выглядит файл, просмотренный с помощью команды cat.

cat /etc/systemd/journald.conf 
See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

Обратите внимание, что различные установки пакетов и фрагменты конфигурации использования находятся в /usr/lib/systemd/*.conf.d/, а конфигурации времени выполнения можно найти в /run/systemd/journald.conf. d/*.conf, который вы можете не использовать.

Включить хранение данных журнала на диске

Ряд дистрибутивов Linux, включая Ubuntu и его производные, такие как Linux Mint, по умолчанию не поддерживают постоянное хранение загрузочных сообщений на диске.

Это можно включить, установив для параметра «Хранилище» значение «постоянное», как показано ниже. При этом будет создан каталог /var/log/journal, в котором будут храниться все файлы журнала.

sudo vi /etc/systemd/journald.conf 
OR
sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

Для получения дополнительных настроек найдите значение всех параметров, которые должны быть настроены в разделе «[Журнал]», набрав их.

man journald.conf

Установка правильного системного времени с помощью команды Timedatectl

Для надежного управления журналами в systemd с помощью службы Journald убедитесь, что настройки времени, включая часовой пояс, в системе верны.

Чтобы просмотреть текущие настройки даты и времени в вашей системе, введите.

timedatectl 
OR
timedatectl status

Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

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

sudo timedatectl set-timezone  Africa/Kampala
sudo timedatectl set-time “13:50:00”

Просмотр сообщений журнала с помощью команды Journalctl

journalctl — это утилита, используемая для просмотра содержимого журнала systemd (который написан службой Journald).

Чтобы показать все собранные журналы без какой-либо фильтрации, введите.

journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel:   Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel:   AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel:   Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400

Просмотр сообщений журнала на основе загрузки

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

journalctl --list-boots

-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1 

Чтобы просмотреть записи журнала текущей загрузки (номер 0), используйте переключатель -b следующим образом (так же, как в примере вывода выше).

journalctl -b

а чтобы просмотреть журнал предыдущей загрузки, используйте относительный указатель -1 с опцией -b, как показано ниже.

journalctl -b -1

Альтернативно используйте идентификатор загрузки следующим образом.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Фильтрация сообщений журнала по времени

Чтобы использовать время в формате всемирного координированного времени (UTC), добавьте параметры --utc следующим образом.

journalctl --utc

Чтобы просмотреть все записи с определенной даты и времени, например. 15 июня 2017 г. в 8:15 введите эту команду.

journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday

Просмотр последних сообщений журнала

Чтобы просмотреть последние сообщения журнала (по умолчанию 10), используйте флаг -n, как показано ниже.

journalctl -n
journalctl -n 20 

Просмотр сообщений журнала, сгенерированных ядром

Чтобы видеть только сообщения ядра, аналогично выводам команды dmesg, вы можете использовать флаг -k.

journalctl -k 
journalctl -k -b 
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

Просмотр сообщений журнала, созданных объектами

Чтобы просмотреть все записи журнала для определенного подразделения, используйте переключатель -u следующим образом.

journalctl -u apache2.service

Чтобы вернуться к текущей загрузке, введите эту команду.

journalctl -b -u apache2.service

Чтобы показать журналы предыдущей загрузки, используйте это.

journalctl -b -1 -u apache2.service

Ниже приведены некоторые другие полезные команды:

journalctl -u apache2.service  
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday

Просмотр сообщений журнала, созданных процессами

Чтобы просмотреть журналы, созданные конкретным процессом, укажите его PID следующим образом.

journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday

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

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

journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today

Просмотр журналов, созданных файлом

Чтобы отобразить все журналы, созданные файлом (возможно, исполняемым файлом), например исполняемым файлом D-Bus или исполняемым файлом bash, просто введите:

journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash

Просмотр сообщений журнала по приоритету

Вы также можете фильтровать вывод на основе приоритетов сообщений или диапазонов приоритетов, используя флаг -p. Возможные значения: 0 – аварийная ситуация, 1 – предупреждение, 2 – крит, 3 – ошибка, 4 – предупреждение, 5 – уведомление, 6 – информация, 7 – отладка):

journalctl -p err

Чтобы указать диапазон, используйте приведенный ниже формат (от появления до предупреждения).

journalctl -p 1..4
OR
journalctl -p emerg..warning

Просмотр сообщений журнала в режиме реального времени

Вы можете практически наблюдать за записью журналов с помощью опции -f (аналогично функции tail -f).

journalctl -f

Обработка форматирования отображения журнала

Если вы хотите контролировать выходное форматирование записей журнала, добавьте флаг -o и используйте следующие параметры: cat,export,json,json-pretty,json-sse,short,short-iso, короткий-монотонный, короткий-точный и многословный (проверьте значение параметров на странице руководства:

Опция cat показывает фактическое сообщение каждой записи журнала без каких-либо метаданных (метки времени и т. д.).

journalctl -b -u apache2.service -o cat

Управление журналами в системе

Чтобы проверить файл журнала на внутреннюю согласованность, используйте параметр --verify. Если все в порядке, на выходе должно быть указано PASS.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

Удаление старых файлов журнала

Вы также можете отобразить текущее использование диска всеми файлами журнала с помощью параметров --disk-usage. Он показывает сумму использования диска всеми архивными и активными файлами журнала:

journalctl --disk-usage

Чтобы удалить старые (заархивированные) файлы журнала, выполните следующие команды:

sudo journalctl --vacuum-size=50M  #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years	#delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4     #delete files so that no more than the specified number of separate journal files remain in storage location

Ротация файлов журнала

И последнее, но не менее важное: вы можете указать журналу ротировать файлы журнала с помощью опции --rotate. Обратите внимание, что эта директива не возвращает результат до завершения операции вращения:

sudo journalctl --rotate

Подробное руководство по использованию и параметрам можно найти на странице руководства журнала Journalctl следующим образом.

man journalctl

Обязательно прочтите несколько полезных статей.

  1. Управление процессом запуска системы и службами (SysVinit, Systemd и Upstart)
  2. Petiti — инструмент анализа журналов с открытым исходным кодом для системных администраторов Linux
  3. Как настроить и управлять ротацией журналов с помощью Logrotate в Linux
  4. lnav — просмотр и анализ журналов Apache из терминала Linux

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