Управление сообщениями журнала в 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
Ознакомьтесь с полезными статьями.
- Управление процессом запуска системы и службами (SysVinit, Systemd и Upstart)
- Petiti — инструмент анализа журналов с открытым исходным кодом для системных администраторов Linux
- Как настроить и управлять ротацией логов с помощью Logrotate в Linux
- lnav — просмотр и анализ журналов Apache с терминала Linux
На этом пока все. Используйте отзывы ниже, чтобы задать любые вопросы или поделиться своими мыслями по этой теме.