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

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


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

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

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

style="color: red;">Важно: Прежде чем двигаться дальше в этом руководстве, вы, возможно, захотите узнать, как управлять службами и юнитами '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 с помощью журналируемого сервиса, убедитесь, что настройки времени, включая часовой пояс, в системе правильны.

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

$ 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

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

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

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

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

$ journalctl -f

Работа с форматированием отображения журнала

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

Опция 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

Поворот файлов журнала

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

$ sudo journalctl --rotate

Для получения подробного руководства по использованию и опций, просмотрите справочную страницу journalctl следующим образом.

$ man journalctl

Ознакомьтесь с полезными статьями.

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

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

Статьи по данной тематике: