У нас есть много производственных приложений (собственных и сторонних), которые оставляют вход в процесс, который запускает приложение, и просто входят в стандартный вывод
за ИНФОРМАЦИЯ
и стдерр
за ОШИБКА
журналы (т.е. только 2 приоритета журналов: ИНФО|ОШИБКА
).
С сервисным блоком systemd для приложения это можно настроить следующим образом:
StandardOutput=журнал
StandardError=журнал
Это позволяет devops управлять всем через модули systemd и журнал, чтобы упростить централизованный сбор журналов, мониторинг всего... и им не нужно беспокоиться о поиске и анализе различных журналов в разных форматах/местоположениях для каждого приложения, которое они развертывают.
Журнал systemd имеет систему приоритетов сообщений, совместимую с 7-уровневой системой приоритетов сообщений syslog. ИНФОРМАЦИЯ
уровень 6
и ОШИБКА
уровень 3
. См. ссылки для более подробной информации.
Проблема в том, что systemd/journal, по-видимому, не различает сообщения, записанные в журнал, из stdout и stderr. Сообщения stdout и stderr записываются в журнал с приоритетом по умолчанию 6 (ИНФОРМАЦИЯ
).
Пример: «Необычное приложение»
/opt/log-test.sh
#!/бин/баш
эхо "Это ОШИБКА" 1>&2
эхо "Это информация"
выход 0
/etc/systemd/system/log-test.service
[Ед. изм]
Description=проверка журнала для журнала
[Оказание услуг]
Тип=простой
ExecStart=/opt/log-test.sh
StandardOutput=журнал
StandardError=журнал
SyslogIdentifier=лог-тест
запустите его и проверьте журнал
$ systemctl запустить лог-тест
$ journalctl -u лог-тест
-- Журналы начинаются в четверг 07.04.2022, 08:17:16 UTC, заканчиваются в четверг, 07.04.2022, 16:35:02 UTC. --
07 апреля, 16:34:58 host.example.com systemd[1]: начата проверка журнала для журнала.
07 апреля 16:34:58 host.example.com log-test.sh[29909]: это ОШИБКА
07 апреля 16:34:58 host.example.com log-test.sh[29909]: Это ИНФОРМАЦИЯ
$ journalctl -u log-test -p 6 # приоритет информации системного журнала
-- Журналы начинаются в четверг 07.04.2022 08:17:16 UTC, заканчиваются в четверг 07.04.2022 16:35:08 UTC. --
07 апреля, 16:34:58 host.example.com systemd[1]: начата проверка журнала для журнала.
07 апреля 16:34:58 host.example.com log-test.sh[29909]: это ОШИБКА
07 апреля 16:34:58 host.example.com log-test.sh[29909]: Это ИНФОРМАЦИЯ
$ journalctl -u log-test -p 3 # приоритет ошибки системного журнала
-- Нет записей --
$
Вы можете видеть, что сообщения stderr и stdout имеют приоритет 6
(ИНФОРМАЦИЯ
) при записи в журнал.
Это проблема, потому что у нас нет простого способа отличить вывод на stdout от stderr при использовании stdio->журнал
в качестве основного средства регистрации.
Это было обсуждалось раньше и решения возможны, но не реализована. Я надеюсь, что команда systemd в конце концов реализует это, но пока мне нужно решение.
Кто-нибудь нашел разумное решение, чтобы сообщения, написанные на стандартный вывод и стандартный вывод, имели разные приоритеты в журнале? без изменения того, как приложение ведет журнал?
Я не хочу, чтобы все приложения, которые мы развертываем (не все написанные нами), должны были реализовывать интеграцию журнала или системного журнала, чтобы получить приоритет журнала, когда нам действительно нужны только два уровня: ИНФОРМАЦИЯ
(стандартный вывод) и ОШИБКА
(стдерр).
Многое из того, что мы развертываем, не является контейнерным, поэтому полагаться на средства ведения журналов контейнера также не решение для нас.
То, что stderr и stdout отправляются в журнал/системный журнал с разными приоритетами по умолчанию, очень важно для облегчения мониторинга ошибок распределенного журнала (при условии соблюдения гигиены разработчика в отношении написания только того, что требует внимания к stderr).
Использованная литература: