Как подключить стандартный вывод и ошибки службы systemd к файлу с датой в пути?

Как подключить стандартный вывод и ошибки службы systemd к файлу с датой в пути?

Я хотел бы запустить серверный процесс под управлением systemd и добавить его стандартный вывод и ошибки в файл, где путь к файлу содержит дату, например так:

/initech/logs/tps-report-app/sales/2023/09/11/console.log

В идеале я бы хотел, чтобы этот путь автоматически обновлялся при изменении даты, но если этого не произойдет, это не конец света, поскольку мы в любом случае перезапускаем наши серверы ночью.

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

TheПараметр конфигурации StandardOutputпозволяет мне добавлять вывод в файл с помощью append:path, но в этой строке нет упоминания о подстановке переменных, поэтому я предполагаю, что это нужно исправить. Есть ли способ включить дату в этот путь?

Если нет, то какой подход здесь лучше? Подключить вывод через именованный канал или что-то подобное к демону журнала, например multilog? Есть ли что-нибудь подобное в «инструментарии» systemd? Обернуть процесс сервера в скрипт типа цепной загрузки, который перенаправляет стандартный вывод и ошибки? Что-то еще?

решение1

Например, вы можете ежедневно обновлять логи с помощью logrotate. Вместо использования StandardOutputвы можете указать своему программному обеспечению отправлять логи в /path/$( something-bashy here)/console.log и как часть postrotateсоздания пути, затем перезапустить соответствующую службу.

Редактировать: только что заметил, что вы упомянули, что серверы перезапускаются каждую ночь. Тогда ваша единственная забота — убедиться, что путь к файлу журнала существует. В этом случае я бы включил создание пути к файлу журнала в ExecStart. Что-то вроде

ExecStart=/bin/bash -ac \
  "mkdir /my/path -p && run_app.sh"

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