Я обновляю набор программ для RHEL7, некоторыес++, некоторыйДжава. Если они запущены как службы systemd, я бы хотел, чтобы они писали в журнал systemd. Если они запущены непосредственно на терминале, скажем, для тестирования, я бы хотел, чтобы они писали в stdout. Как мне сделать это наиболее элегантно?
Я хочу воспользоваться расширенными функциями журнала — регистрацией серьезности, имени файла, номера строки, имени потока и т. д. — поэтому простого вывода в stdout недостаточно.
Поиск, который я сделал, дал совет проверить родительский PID процесса или проверить его cgroup. Есть ли лучший способ? Это кажется неуклюжими решениями. В идеале была бы функция, которую я мог бы вызвать, или переменная окружения для проверки.
Дополнительная информация:
- Дляс++программы, которые я планирую назватьsd_journal_print(3).
- ДляДжавапрограммы, которые я планирую использовать SLF4J + Logback +logback-журнал.
(Мой запасной план — использовать параметр командной строки, но было бы неплохо иметь функцию автоматического определения.)
решение1
В systemd версии 231 JOURNAL_STREAM
переменная окружения была введена именно для этой цели. Ваша программа проверяет ее значение, сравнивает его с устройством и номером i-node ее стандартной ошибки и соответствующим образом изменяет свое поведение.
Когданетподключенный к журналу, вы (конечно) всегда можете использовать что-то вроде JSON, записанного (в виде одной строки на объект) в стандартную ошибку, чтобы иметь структурированные записи журнала там тоже. RFC 5424 также имеет (более ограниченные) варианты структурированных данных.
решение2
systemd
уже элегантно решает этот вопрос для вас, как описано вsystemd.exec.
Журнал в STDOUT. При запуске через systemd, systemd по умолчанию перенаправляет STDOUT в журнал.
Другой вариант — journal+console
если вы всегда хотите входить в оба аккаунта.
Ведение журнала в STDOUT также является наилучшей практикой вДизайн приложения 12 Факторов.