systemd journald

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

systemd 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:12 vm-9999999 sshd[31697]: Failed password for root from 42.7.26.16 port 48596 ssh2
июн 10 14:07:15 vm-9999999 systemd[1]: Starting Docker Socket for the API.
— Subject: Unit docker.socket has begun start-up
— Defined-By: systemd
— Support: https://www.debian.org/support

— Unit docker.socket has begun starting up.
июн 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.
— Subject: Unit docker.socket has failed
— Defined-By: systemd
— Support: https://www.debian.org/support

— Unit docker.socket has failed.

— The result is RESULT.
июн 10 14:07:15 vm-9999999 systemd[1]: Dependency failed for Docker Application Container Engine.
— Subject: Unit docker.service has failed
— Defined-By: systemd
— Support: https://www.debian.org/support

— Unit docker.service has failed.

— The result is RESULT.

июн 10 14:07:15 vm-9999999 systemd[1]: docker.service: Job docker.service/start failed with result 'dependency'.
июн 10 14:07:15 vm-9999999 sshd[31697]: Failed password for root from 42.7.26.16 port 48596 ssh2

В данном случае 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

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