Определить, должна ли программа записывать данные в системный журнал или в стандартный вывод

Определить, должна ли программа записывать данные в системный журнал или в стандартный вывод

Я обновляю набор программ для RHEL7, некоторые, некоторый. Если они запущены как службы systemd, я бы хотел, чтобы они писали в журнал systemd. Если они запущены непосредственно на терминале, скажем, для тестирования, я бы хотел, чтобы они писали в stdout. Как мне сделать это наиболее элегантно?

Я хочу воспользоваться расширенными функциями журнала — регистрацией серьезности, имени файла, номера строки, имени потока и т. д. — поэтому простого вывода в stdout недостаточно.

Поиск, который я сделал, дал совет проверить родительский PID процесса или проверить его cgroup. Есть ли лучший способ? Это кажется неуклюжими решениями. В идеале была бы функция, которую я мог бы вызвать, или переменная окружения для проверки.

Дополнительная информация:

(Мой запасной план — использовать параметр командной строки, но было бы неплохо иметь функцию автоматического определения.)

решение1

В systemd версии 231 JOURNAL_STREAMпеременная окружения была введена именно для этой цели. Ваша программа проверяет ее значение, сравнивает его с устройством и номером i-node ее стандартной ошибки и соответствующим образом изменяет свое поведение.

Когданетподключенный к журналу, вы (конечно) всегда можете использовать что-то вроде JSON, записанного (в виде одной строки на объект) в стандартную ошибку, чтобы иметь структурированные записи журнала там тоже. RFC 5424 также имеет (более ограниченные) варианты структурированных данных.

решение2

systemdуже элегантно решает этот вопрос для вас, как описано вsystemd.exec.

Журнал в STDOUT. При запуске через systemd, systemd по умолчанию перенаправляет STDOUT в журнал.

Другой вариант — journal+consoleесли вы всегда хотите входить в оба аккаунта.

Ведение журнала в STDOUT также является наилучшей практикой вДизайн приложения 12 Факторов.

Связанный контент