systemd-journald — компонент systemd, отвечающий за сбор, хранение и индексацию системных журналов. В отличие от традиционного syslog (текстовые файлы без структуры), journald хранит логи в бинарном формате с метаданными: PID, UID, имя юнита systemd, syslog-приоритет (0–7), временная метка с наносекундной точностью, boot ID. Это позволяет фильтровать логи по любому полю без grep по строкам.
Как работает journald
journald собирает сообщения из нескольких источников одновременно:
- Ядро Linux (kmsg — заменяет dmesg для boot-сообщений)
- Stdout/stderr всех systemd-юнитов (автоматически, без настройки)
- Сообщения через syslog socket (совместимость со старыми демонами)
- Нативный Journal API (journald_send()) для приложений с структурированными полями
- Аудит-подсистема ядра Linux (audit)
Основные команды journalctl:
# Последние 100 строк nginx:
journalctl -u nginx.service -n 100
# Логи за последний час:
journalctl --since "1 hour ago"
# Только ошибки и критические:
journalctl -p err
# Следить в реальном времени:
journalctl -f
# Логи конкретного PID:
journalctl _PID=12345
# Экспорт в JSON:
journalctl -u nginx -o json --no-pager
История
journald разработал Леннарт Петтеринг (Lennart Poettering) как часть systemd. Представлен в systemd версии 38 в декабре 2011 года. Переход на journald вызвал дискуссии: критики указывали на бинарный формат (риск потери журнала при повреждении файла), сторонники — на структурированное хранение и индексацию. Debian перешёл на systemd с journald в версии 8 (Jessie, 2015), Ubuntu — в 15.04 (2015).
Настройка journald
Основные параметры в /etc/systemd/journald.conf:
SystemMaxUse=500M— максимальный размер журнала на дискеMaxRetentionSec=1month— срок хранения записейCompress=yes— сжатие старых журналов (включено по умолчанию)Storage=persistent— хранить на диске (default: auto)ForwardToSyslog=yes— пересылать в rsyslog/syslog-ng для совместимостиRateLimitBurst=1000— лимит сообщений в интервал (защита от log flood)
journald в серверной инфраструктуре
Для централизованного сбора логов с нескольких VPS-серверов journald интегрируется с log-aggregation-системами: Loki + Grafana (современный вариант, минимальные ресурсы), ELK-стек (Elasticsearch + Logstash + Kibana, мощный, но тяжёлый), Graylog. Плагин systemd для Loki Promtail автоматически собирает все journald-логи без дополнительной конфигурации. systemd-journal-remote пересылает журналы на централизованный сервер по HTTPS. Интеграция с Prometheus через systemd_exporter позволяет алертить на статусы юнитов: сервис упал и не перезапустился за 5 минут.
Просмотр размера журнала: journalctl --disk-usage. Принудительная ротация: journalctl --vacuum-size=200M. Экспорт в текстовый файл: journalctl --since "2024-01-01" > /backup/journal.log.
journald vs rsyslog
До systemd логирование обеспечивал rsyslog (syslogd), хранящий логи в текстовых файлах. journald не заменяет rsyslog полностью — оба могут работать одновременно: journald перехватывает все события, rsyslog читает из journal-сокета и записывает в текстовые файлы для совместимости с традиционными инструментами. ForwardToSyslog=yes в journald.conf включает переброс в rsyslog.
journald vs традиционный syslog
| Параметр | journald | rsyslog/syslog-ng |
|---|---|---|
| Формат хранения | Бинарный (индексированный) | Текстовые файлы |
| Структурированные поля | Да (PID, UID, юнит) | Только через шаблон |
| Быстрый поиск | Да (индекс по полям) | grep по файлам |
| Ротация | Автоматическая по размеру | logrotate |
| Форвардинг в ELK/Loki | Через systemd-journal-remote | Нативный форвардинг |
На практике большинство production-серверов запускают и journald, и rsyslog одновременно: journald собирает все логи от systemd-сервисов, rsyslog форвардит их в централизованную систему (Elasticsearch, Loki, Graylog). Параметр ForwardToSyslog=yes в journald.conf обеспечивает эту интеграцию.