Journald — система журналирования Systemd


Система журналирования systemd journald — бинарная система хранения служебной информации, которая появляется на stdout и stderr сервисов. Информация собирается journald, записывается и хранится.

В материале рассмотрены основные команды для journald, позволяющие находить необходимые данные по интересующему в конкретный момент сервису.



journald и отладка сервисов, запускаемых через systemd


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



Рассмотрим запуск через systemctl сервиса docker.

systemctl start docker

A dependency job for docker.service failed. See 'journalctl -xe' for details.



Чтобы просмотреть отладочную информацию используем journalctl.

journalctl -xe

июн 10 14:07:15 vm-9999999 systemd[1]: Starting Docker Socket for the API.
июн 10 14:07:15 vm-9999999 systemd[31721]: docker.socket: Failed to resolve group docker: No such process
июн 10 14:07:15 vm-9999999 systemd[1]: docker.socket: Control process exited, code=exited status=216
июн 10 14:07:15 vm-9999999 systemd[1]: docker.socket: Failed with result 'exit-code'.
июн 10 14:07:15 vm-9999999 systemd[1]: Failed to listen on Docker Socket for the API.
— Unit docker.socket has failed.
июн 10 14:07:15 vm-9999999 systemd[1]: Dependency failed for Docker Application Container Engine.
— Unit docker.service has failed.

июн 10 14:07:15 vm-9999999 systemd[1]: docker.service: Job docker.service/start failed with result 'dependency'.



В данном случае Docker не запускается из-за проблем с зависимостями.

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



Параметры журналирования systemd journald можно изменить в /etc/systemd/journald.conf. Все его директивы по умолчанию закомментированы.


systemd journald



Поскольку systemd оперирует понятием unit, все логи выводятся с указанием этого unit-а. Например, для Nginx

journalctl -b -u nginx.service


Ключ -b означает, что требуется информация с момента последней загрузки системы



Также часто нужны сообщения ядра, чтобы увидеть их добавляется ключ -k

journalctl -b-k



В отличие от стандартных систем информация не пишется в заданный лог файл, а выводится непосредственно в консоль. Информация передается в less и ее нельзя обрабатывать стандартными средствами вроде grep или sed.



Поменять это поведение можно так

journalctl --no-pager



Другие опции journalctl, которые очень часто используются


Вывод списка загрузок системы, цифры затем можно передавать вместе с ключем -b

journalctl --list-boots



Логи по PID-у

journalctl _PID=112



И по бинарному файлу

journalctl /usr/bin/docker



Также можно гибко задавать время, за которое требуется информация

journalctl --since "2018-07-20 06:00:00"

journalctl --since 09:00 --until now

journalctl --since 06:00 --until "1 hour ago"



Просмотр информации о системных процессах в режиме реального времени

journalctl -f



Список всех возможных фильтров всегда доступен в справке

man systemd.journal-fields



Эти команды journald являются базовыми и их в большинстве случаев достаточно для отладки сервисов, которые запускает systemd.

Читайте подробнее про systemd скрипты.

Сказать спасибо