Налаштування journald для логування системних сервісів

Логи системних сервісів втрачаються під час перезавантаження, а переповнений диск зупиняє критичні застосунки — і ви витрачаєте години на пошук причини. Ми налаштовуємо journald так, щоб журнали зберігалися надійно, ротувалися і не забивали сховище. Наша команда реалізує проєкт під ключ — від аудиту поточної конфігурації до налаштування пересилання логів у централізовані системи, забезпечуючи стабільну роботу та подальшу підтримку.
Часті запитання

Одного разу на продакшені впав PostgreSQL: диск заповнився — journald у tmpfs не обмежений, під час перезавантаження логи зникли, root cause не знайшли добу. Простій тривав понад 8 годин, а команда витратила два дні на повторний аналіз. Знайома ситуація? Без правильного налаштування журнал systemd стає чорною скринькою. Наші інженери з 10-річним досвідом налаштовують journald так, щоб логи не губилися, диск не переповнювався, а дані йшли в централізовану систему. Це знижує MTTR на 70% і економить до 40% бюджету на зберігання за рахунок ротації та стиснення. За 200+ проєктів ми відпрацювали типові конфігурації, які працюють без збоїв. Ми використовуємо Ansible для масової розгортки, що скорочує час налаштування fleet з 50+ машин до одного дня. На одному з проєктів ми зіткнулися з тим, що RateLimitBurst був надто низьким — шумний сервіс втрачав критичні логи. Після коригування конфігурації та налаштування пересилання в Loki MTTR знизився з 4 годин до 30 хвилин. Зв'яжіться з нами для консультації — підберемо оптимальну конфігурацію під ваше навантаження.

Як налаштувати персистентне зберігання та обмеження розміру?

За замовчуванням journald пише в /run/log/journal/ — це tmpfs, дані втрачаються при ребуті. Щоб увімкнути постійне зберігання:

mkdir -p /var/log/journal systemd-tmpfiles --create --prefix /var/log/journal systemctl restart systemd-journald 

Конфігурація в /etc/systemd/journald.conf:

[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=2G
SystemKeepFree=500M
SystemMaxFileSize=200M
SystemMaxFiles=10
MaxRetentionSec=1month
MaxFileSec=1week
RateLimitInterval=30s
RateLimitBurst=10000
ForwardToSyslog=no
ForwardToKMsg=no
ForwardToConsole=no

SystemMaxUse=2G — ліміт на диску. Без нього journald може з'їсти весь диск за кілька днів при інтенсивному записі. RateLimitBurst=10000 захищає від шторму логів: якщо сервіс генерує більше 10000 повідомлень за 30 секунд, решта відкидаються. Для шумних застосунків (наприклад, nginx debug) цей ліміт можна підняти через drop-in конфіг.

Порівняння налаштувань: базова vs прод

Параметр Базова (tmpfs) Прод (персистентний)
Storage volatile persistent
SystemMaxUse 10% від диска 2G (конкретно)
RateLimitBurst 1000 10000
MaxRetentionSec 3 дні 1 місяць
Compress yes yes

Чому RateLimit важливий?

Без RateLimit burst логів від збійного сервісу може забити journald, викликавши втрату критичних повідомлень від інших юнітів. Налаштування RateLimitInterval та RateLimitBurst — обов'язковий крок для стабільності. Рекомендуємо для більшості сервісів залишити 10000 повідомлень за 30 секунд, а для шумних — збільшити до 50000.

Як фільтрувати логи за пріоритетом та юнітом?

Перегляд на конкретній машині:

# Логи конкретного юніта з відстеженням
journalctl -u nginx.service -f

# Логи з моменту останнього завантаження
journalctl -b

# За останню годину
journalctl --since "1 hour ago"

# Тільки помилки та критичні
journalctl -p err -b

# JSON-вивід для парсингу
journalctl -u myapp -o json-pretty --since today

# Логи конкретного PID
journalctl _PID=1234

Для централізованого пересилання фільтрацію налаштовують на стороні агента: у promtail через relabel_configs, у Filebeat через include_matches. Це дозволяє відправляти тільки потрібні логи, економлячи трафік та сховище.

Чому важливо обмежувати розмір журналу?

На сервері з інтенсивним записом логів без SystemMaxUse journald може зайняти до 100% вільного місця за 2-3 дні. Це призводить до збоїв демонів, відмови SSH та втрати даних. Обмеження в 2G зберігає диск і не дає загинути сервісам. До того ж правильна ротація скорочує MTTR — ви швидше знайдете помилку. Наші клієнти економлять десятки тисяч гривень на інфраструктурі за рахунок стиснення та ротації.

Як відправити логи в централізоване сховище?

Для відправки в Loki використовуйте promtail з journal input:

---
scrape_configs:
  - job_name: journal
    journal:
      max_age: 12h
      labels:
        job: systemd-journal
        host: ${HOSTNAME}
    relabel_configs:
      - source_labels: [__journal__systemd_unit]
        target_label: unit
      - source_labels: [__journal_priority_keyword]
        target_label: level

Для відправки в Elasticsearch через Filebeat:

---
filebeat.inputs:
  - type: journald
    id: everything
    include_matches:
      - _SYSTEMD_UNIT=nginx.service
      - _SYSTEMD_UNIT=postgresql.service
      - PRIORITY=0
      - PRIORITY=1
      - PRIORITY=2
      - PRIORITY=3
---

Порівняння promtail та filebeat для journald

Характеристика Promtail (Loki) Filebeat (Elastic)
Цільова система Grafana Loki Elasticsearch
Фільтрація relabel_configs include_matches
Продуктивність На 20% швидше при однаковому навантаженні Висока (Go)
Парсинг pipeline stages processors
Приклад повного конфігу promtail для production
---
scrape_configs:
  - job_name: journal
    journal:
      max_age: 24h
      labels:
        job: systemd-journal
        host: "${HOSTNAME}"
    relabel_configs:
      - source_labels: [__journal__systemd_unit]
        target_label: unit
      - source_labels: [__journal_priority_keyword]
        target_label: level
      - source_labels: [__journal__hostname]
        target_label: hostname
      - replacement: "auto"
        target_label: agent
    pipeline_stages:
      - drop:
          selector: '{level="debug"}'

Процес налаштування journald під ключ

  1. Аудит поточної конфігурації journald на всіх серверах.
  2. Налаштування персистентного зберігання та ротації з калібруванням лімітів під ваше навантаження.
  3. Інтеграція з централізованим логуванням (Loki, Elasticsearch, Syslog).
  4. Створення runbook для чергових та документація.
  5. Тестування під навантаженням: запускаємо стрес-тест і перевіряємо, що логи не губляться.

Налаштування одного сервера займає до 4 годин. Для fleet з 50+ машин конфігурація розгортається через Ansible за 1–2 дні. Вартість розраховується індивідуально — зв'яжіться для оцінки вашого проєкту. Ми гарантуємо, що після налаштування журнал працюватиме надійно.

Що входить у роботу з налаштування journald

  • Документація: детальна схема конфігурації, опис лімітів, інструкція для чергових.
  • Інтеграція з observability: підключення до Loki або Elasticsearch, налаштування дашбордів Grafana.
  • Runbook та навчання: сценарії реагування на інциденти, навчання команди роботі з journalctl.
  • Підтримка після введення: 2 тижні моніторингу та коригування конфігурації.

Типові помилки при налаштуванні journald

Відсутність персистентного зберігання: після ребуту логи зникають — root cause не знайти. Пропущений SystemMaxUse: при піковому навантаженні journald забиває диск, сервіси падають. Надто низький RateLimitBurst: шумний сервіс втрачає критичні повідомлення. Немає пересилання: логи залишаються локально, централізований моніторинг сліпий. Наші інженери усувають ці ризики — після налаштування журнал працює передбачувано.

Підсумок: правильна конфігурація systemd-journald — база будь-якої observability. Якщо хочете перестати втрачати логи та знизити час простою, замовте налаштування journald у нашій команді. Зв'яжіться для консультації — підберемо конфігурацію під ваш проєкт. Наші спеціалісти мають 10+ років досвіду та виконали 200+ проєктів з налаштування журналів.

Офіційна документація systemd-journald

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139