systemd (Русский)/Journal (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи systemd/Journal. Дата последней синхронизации: 10 декабря 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

systemd использует журнал (journal), собственную систему ведения логов, в связи с чем больше не требуется запускать отдельный демон логирования. Для чтения логов используйте команду journalctl(1).

В Arch Linux каталог /var/log/journal/ — это часть пакета systemd и по умолчанию (когда в конфигурационном файле /etc/systemd/journald.conf параметру Storage= задано значение auto) журнал записывается именно в /var/log/journal/. Если каталог будет удалён, systemd не пересоздаст его автоматически и вместо этого будет вести журнал в /run/systemd/journal без сохранения между перезагрузками. Однако каталог будет пересоздан, если добавить Storage=persistent в journald.conf и перезапустить systemd-journald.service (или перезагрузиться).

Сообщения в журнале классифицируются по уровню приоритета и категории (Facility). Классификация записей соответствует классическому протоколу Syslog (RFC 5424).

Уровни приоритета

Коды важности syslog (в systemd называются приоритетами) используются для пометки важности сообщений RFC 5424.

Значение Важность Ключевое слово Описание Примеры
0 Emergency emerg Cистема не работоспособна Серьёзный баг в ядре, дамп памяти systemd.
Данный уровень не должен использоваться приложениями.
1 Alert alert Cистема требует немедленного вмешательства Отказ важной подсистемы. Потеря данных.
kernel: BUG: unable to handle kernel paging request at ffffc90403238ffc.
2 Critical crit Cостояние системы критическое Аварийные отказы, дампы памяти. Например, знакомое сообщение:
systemd-coredump[25319]: Process 25310 (plugin-containe) of user 1000 dumped core
Отказ основных приложений системы, например, X11.
3 Error err Cообщения об ошибках Сообщение о некритической ошибке:
kernel: usb 1-3: 3:1: cannot get freq at ep 0x84,
systemd[1]: Failed unmounting /var.,
libvirtd[1720]: internal error: Failed to initialize a valid firewall backend
4 Warning warning Предупреждения о возможных проблемах В некорневой файловой системе остался всего 1 ГБ свободного места.
org.freedesktop. Notifications[1860]: (process:5999): Gtk-WARNING **: Locale not supported by C library. Using the fallback 'C' locale.
5 Notice notice Cообщения о нормальных, но важных событиях systemd[1]: var.mount: Directory /var to mount over is not empty, mounting anyway,
gcr-prompter[4997]: Gtk: GtkDialog mapped without a transient parent. This is discouraged
6 Informational info Информационные сообщения lvm[585]: 7 logical volume(s) in volume group "archvg" now active
7 Debug debug Отладочные сообщения kdeinit5[1900]: powerdevil: Scheduling inhibition from ":1.14" "firefox" with cookie 13 and reason "screen"

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

Категории

Коды категорий (facility) syslog используются для указания типа программы, добавляющего сообщение в лог RFC 5424.

Код категории Ключевое слово Описание Информация
0 kern Сообщения ядра
1 user Сообщения программного обеспечения пользователя
2 mail Почтовая система Архаический POSIX всё ещё поддерживается и иногда используется (см. mail(1) для получения более подробной информации)
3 daemon Системные службы Все демоны, включая systemd и его подсистемы
4 auth Сообщения безопасности (авторизации) См. также код 10
5 syslog Собственные сообщения syslogd Для реализаций syslogd (не используется в systemd, см. код 3)
6 lpr Подсистема печати (архаическая подсистема)
7 news Подсистема новостных групп (архаическая подсистема)
8 uucp Подсистема UUCP (архаическая подсистема)
9 clock daemon systemd-timesyncd
10 authpriv Сообщения безопасности (авторизации) См. также код 4
11 ftp Служба FTP
12 - Подсистема NTP
13 - Журнал аудита
14 - Аварийный журнал
15 cron Служба планирования
16 local0 Локальное использование 0 (local0)
17 local1 Локальное использование 1 (local1)
18 local2 Локальное использование 2 (local2)
19 local3 Локальное использование 3 (local3)
20 local4 Локальное использование 4 (local4)
21 local5 Локальное использование 5 (local5)
22 local6 Локальное использование 6 (local6)
23 local7 Локальное использование 7 (local7)

Полезные категории для наблюдения: 0, 1, 3, 4, 9, 10, 15.

Фильтрация вывода

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

Примеры:

  • Показать сообщения с момента текущей загрузки системы:
    # journalctl -b
    Также пользователи часто интересуются сообщениями предыдущей загрузки (например, если произошёл невосстановимый сбой системы). Это возможно, если задать параметр флагу -b: journalctl -b -0 покажет сообщения с момента текущей загрузки, journalctl -b -1 — предыдущей загрузки, journalctl -b -2 — следующей за предыдущей и т.д. Для просмотра полного описания смотрите страницу справочного руководства journalctl(1), поддерживается и более мощная семантика.
  • Добавить пояснения к сообщениям логов из каталога сообщений, где это возможно:
    # journalctl -x
    Обратите внимание, что эту возможность лучше не использовать, когда излишние комментарии нежелательны — например, при добавлении копии логов в сообщение о баге или письмо в поддержку. Вывести существующие пункты каталога можно командой journalctl --list-catalog.
  • Показать сообщения, начиная с определённой даты (и, опционально, времени):
    # journalctl --since="2012-10-30 18:17:16"
  • Показать сообщения за последние 20 минут:
    # journalctl --since "20 min ago"
  • Следить за появлением новых сообщений:
    # journalctl -f
  • Показать сообщения конкретного исполняемого файла:
    # journalctl /usr/lib/systemd/systemd
  • Показать сообщения конкретного процесса:
    # journalctl _PID=1
  • Показать сообщения конкретного юнита:
    # journalctl -u man-db.service
  • Показать сообщения от пользовательской службы конкретного юнита:
    $ journalctl --user -u dbus
  • Показать кольцевой буфер ядра:
    # journalctl -k
  • Показать сообщения только с приоритетами error, critical и alert:
    # journalctl -p err..alert
    Также можно использовать числа, например, journalctl -p 3..1. Если указать одно число/уровень приоритета, например, journalctl -p 3, то также будут показаны сообщения и с более высоким приоритетом (от 0 до 3, в данном случае).
  • Показать эквивалент auth.log используя фильтрацию категорий syslog:
    # journalctl SYSLOG_FACILITY=10
  • Если в каталоге с журналами (по умолчанию /var/log/journal) очень много данных, то фильтрация вывода journalctl может занять несколько минут. Процесс можно значительно ускорить с помощью опции --file, указав journalctl только самый свежий журнал:
    # journalctl --file /var/log/journal/*/system.journal -f

Для получения дополнительной информации смотрите страницы справочного руководства journalctl(1), systemd.journal-fields(7) или пост в блоге Леннарта Пёттеринга.

Совет: По умолчанию journalctl отсекает части строк, которые не вписываются в экран по ширине, хотя иногда перенос строк может оказаться более предпочтительным. Управление этой возможностью производится посредством переменной окружения SYSTEMD_LESS, в которой содержатся опции, передаваемые в less (программу постраничного просмотра, используемую по умолчанию). По умолчанию переменная имеет значение FRSXMK (для получения дополнительной информации смотрите less(1) и journalctl(1)).

Если убрать опцию S, будет достигнут требуемый результат. Например, запустите journalctl, как показано здесь:

$ SYSTEMD_LESS=FRXMK journalctl
Для использования такого поведения по умолчанию, экспортируйте переменную из файла ~/.bashrc или ~/.zshrc.
Совет: Несмотря на то, что журнал хранится в двоичном формате, содержимое сообщений не изменяется. Это означает, что их можно просматривать при помощи strings, например, для восстановления системы в окружении без systemd. Пример команды:
$ strings /mnt/arch/var/log/journal/af4967d77fba44c6b093d0e9862f6ddd/system.journal | grep -i message

Ограничение размера журнала

Если журнал сохраняется при перезагрузке, его размер по умолчанию ограничен значением в 10% от объема соответствующей файловой системы (и максимально может достигать 4 ГиБ). Например, для каталога /var/log/journal, расположенном на корневом разделе в 20 ГиБ, максимальный размер журналируемых данных составит 2 ГиБ. На разделе же 50 ГиБ журнал сможет занять до 4 ГиБ. Текущие пределы для вашей системы можно узнать из логов systemd-journald:

# journalctl -b -u systemd-journald

Максимальный объем постоянного журнала можно задать вручную, раскомментировав и отредактировав следующий параметр:

/etc/systemd/journald.conf
SystemMaxUse=50M

Также возможно использование конфигурационных сниппетов вместо редактирования глобального файла конфигурации. В таком случае поместите переопределения в разделе [Journal]:

/etc/systemd/journald.conf.d/00-journal-size.conf
[Journal]
SystemMaxUse=50M

Перезапустите systemd-journald.service для применения изменений.

Для получения дополнительной информации обратитесь к странице справочного руководства journald.conf(5).

Ограничение размера для юнита

Отредактируйте файл юнита службы, которую вы хотите настроить (например, sshd), добавив параметр LogNamespace=ssh в раздел [Service].

Затем создайте файл [email protected], скопировав содержимое файла /etc/systemd/journald.conf. Отредактируйте его, задав необходимое значение SystemMaxUse.

Перезапустите юнит, чтобы включилась новая служба журнала [email protected]. Логи службы из определённого "пространства имён" можно увидеть командой journalctl --namespace ssh.

Подробнее о пространствах имён журнала см. systemd-journald.service(8) § JOURNAL NAMESPACES.

Очистка файлов журнала вручную

Файлы журнала можно удалить из директории /var/log/journal/, к примеру, с помощью rm или journalctl для удаления части журналов по определённым критериям. Например:

  • Удалять заархивированные файлы журнала, пока занимаемое ими место не составит менее 100 МиБ:
    # journalctl --vacuum-size=100M
  • Ограничить все файлы журнала хранением данных только за последние две недели:
    # journalctl --vacuum-time=2weeks

Для получения дополнительной информации, обратитесь к journalctl(1).

Journald вместе с syslog

Совместимость с классической реализацией syslog можно обеспечить, перенаправляя все сообщения systemd через сокет /run/systemd/journal/syslog. Для работы демона syslog с журналом, следует привязать его к данному сокету вместо /dev/log (официальное сообщение).

Для перенаправления данных в сокет, в journald.conf по умолчанию задан параметр ForwardToSyslog=no, чтобы избежать перегрузки на систему, так как rsyslog или syslog-ng самостоятельно получают сообщения из журнала.

Смотрите Syslog-ng#Overview и Syslog-ng#syslog-ng and systemd journal или rsyslog для получения подробной информации о конфигурировании.

Перенаправление журнала в /dev/tty12

Создайте drop-in каталог /etc/systemd/journald.conf.d и файл fw-tty12.conf в нём со следующим содержимым:

/etc/systemd/journald.conf.d/fw-tty12.conf
[Journal]
ForwardToConsole=yes
TTYPath=/dev/tty12
MaxLevelConsole=info

Затем перезапустите службу systemd-journald.

Выбор журнала для просмотра

Иногда необходимо проверить логи другой системы, например, загружаясь с работоспособной системы для восстановления неисправной. В таком случае примонтируйте диск, к примеру, в /mnt и укажите путь журнала с помощью флага -D/--directory следующим образом:

# journalctl -D /mnt/var/log/journal -e

Доступ к журналу как пользователь

По умолчанию обычные пользователи могут читать только свой собственный пользовательский журнал. Чтобы дать доступ на чтение системного журнала обычному пользователю, добавьте его в группу systemd-journal. Для групп adm и wheel также предоставляется доступ на чтение.

Подробнее смотрите journalctl(1) § DESCRIPTION и Пользователи и группы#Пользовательские группы.