# Журнали в journald замість файлів докера. # # docker compose -f docker-compose.yml -f deploy/docker-compose.journald.yml up -d # # ЩО ЦЕ ДАЄ # # * `docker logs` ПРОДОВЖУЄ працювати. Це головна причина обрати # journald, а не syslog: драйвер syslog віддає рядки назовні й # нічого не лишає докеру, тож `docker logs` після нього мовчить — # і людина, яка про це не знає, вирішує, що служба нічого не пише. # * Історія переживає перестворення контейнера. Типовий json-file # живе всередині контейнера: `docker compose up -d` після оновлення # стирає весь журнал рівно тоді, коли він потрібен — щоб порівняти # «до» і «після». # * Ротацію робить systemd, а не ми. Одним місцем менше. # # ЧОГО НЕ ДАЄ # # Простих текстових файлів у /var/log/netpulse. journald тримає свій # формат, і читають його journalctl-ом: # # journalctl CONTAINER_NAME=netpulse-api-1 -f # journalctl CONTAINER_NAME=netpulse-collector-1 --since "2 hours ago" # journalctl CONTAINER_NAME=netpulse-api-1 -p err --since today # # Це той самий tail і grep, лише іншою командою. Кому потрібні саме # файли — ставить rsyslog і додає одне правило; ми цього не робимо за # замовчуванням, бо пакет на чужому сервері ставить власник, а не # продукт. # # ЧОМУ ОКРЕМИЙ ФАЙЛ, А НЕ ЗМІННА # # Опції max-size і max-file існують ЛИШЕ в json-file. Передати їх # journald означає «unknown log opt» і контейнер, який не стартує. # Прибрати ключ умовно compose не вміє, тож перемикач змінною тут # зробив би нерозв'язний стан: драйвер новий, опції старі. # # СТЕЛЯ МІСЦЯ задається не тут, а в journald (він спільний для машини): # # /etc/systemd/journald.conf → SystemMaxUse=1G # systemctl restart systemd-journald # # Типово journald бере до 10% файлової системи — на диску 30 ГБ це # 3 ГБ, що більше, ніж потрібно, і саме тому варто задати явно. x-journald: &journald driver: journald options: # Тег — саме ІМ'Я контейнера, без префікса зі скісною. # # Спершу стояло "netpulse/{{.Name}}", і це виглядало охайніше. Але # rsyslog обриває властивість programname на скісній: для всіх # контейнерів вона ставала просто "netpulse", а ім'я служби лишалось # усередині syslogtag. Правило «писати кожній службі свій файл» через # це не спрацьовувало жодного разу — каталог створювався й лишався # порожнім, тобто поломка виглядала як «rsyslog не працює». # # Імена контейнерів і так починаються з імені проєкту (netpulse-api-1), # тож префікс нічого не додавав, окрім цієї халепи. tag: "{{.Name}}" services: db: logging: *journald cache: logging: *journald migrate: logging: *journald cli: logging: *journald api: logging: *journald collector: logging: *journald proxy: logging: *journald agent: logging: *journald