Система журналирования 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 оперирует понятием 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 скрипты.