ФАЙЛИ В /var/log/netpulse. rsyslog читає journald і розкладає по файлах
на службу. Драйвер docker лишається journald, а не syslog: syslog
віддав би рядки назовні й нічого не лишив докеру, тож `docker logs`
замовк би назавжди — і мовчання виглядало б як «служба нічого не пише».
Тепер працюють усі три шляхи: docker logs, journalctl, файли.
Дорогою три власні помилки, кожна виглядала як «rsyslog не працює»:
1. Умова матчила $!CONTAINER_NAME — метадані журналу. journalctl їх
бачить, а до правил rsyslog вони доходять не завжди. Каталог
створювався й лишався порожнім.
2. Тег «netpulse/{{.Name}}» здавався охайнішим, але rsyslog обриває
programname на скісній: для ВСІХ контейнерів вона ставала просто
«netpulse». Тег тепер — саме ім'я контейнера, воно й так має
префікс проєкту.
3. Шаблон `%msg:::sp-if-no-1st-sp,drop-last-lf%` давав ПОРОЖНІЙ
текст: файли були, рядки були, слів не було. Журнал виглядав
робочим і не містив нічого — найгірший різновид поломки.
Конфігурації в deploy/, щоб їхали клієнтам, а не лишались разовим
налаштуванням одного сервера.
МІНІКАРТА. Штрих рядка був 2 px при 3 px на рядок — просвіт в один
піксель. На дробовому масштабі екрана (1.25, 1.5 — тобто на більшості
ноутбуків) він губився при округленні, і рядки злипались у суцільну
пляму: мінікарта показувала не форму конфігу, а сірий прямокутник.
Тепер штрих 1 px, просвіт удвічі товщий за нього й переживає будь-яке
округлення. Малюнок став блідішим — це правильний бік розміну: на
мінікарту дивляться, щоб побачити структуру, а не прочитати текст.
78 lines
4 KiB
YAML
78 lines
4 KiB
YAML
# Журнали в 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
|