Как вывести журналы в файл из содержимого службы с помощью systemd?

Ну, у меня есть служба, настроенная с помощью systemctl. Это файл конфигурации:

[Unit]
Description=The description of the service (:
After=network.target

[Service]
ExecStartPre=/bin/echo 'Starting Service' >> /var/log/node/myapp.log
ExecStart=/root/.nvm/versions/node/v5.0.0/bin/node ./bin/www
ExecStopPost=/bin/echo 'Stopping Service' >> /var/log/node/myapp.log
Restart=always
#StandardOutput=/var/log/node/myapp.log
#StandardError=/var/log/node/myapp.log
SyslogIdentifier=myapp
Environment=NODE_ENV=production
WorkingDirectory=/home/user/node-apps/theapp

[Install]
WantedBy=multi-user.target

Что мне нужно?:

1) ExecStartPre а также ExecStopPost мог написать сообщение 'starting service' или же 'stopping service' в файл /var/log/node/myapp.log, С вышеупомянутой конфигурацией, не работает, он только выводит 'Starting Service' >> /var/log/node/myapp.log а также 'Stopping Service' >> /var/log/node/myapp.log в journalctl, (Я проверил с journalctl -u myapp)

2) Мне нужно, чтобы вместо всех журналов приложения выводились journalctl, может выводить в файл. Пример: /var/log/node/myapp.log, Я имею в виду, если в моем приложении у меня есть console.log()это может быть там.

С выскочкой я могу сделать это следующим образом:

script

exec start-stop-daemon --start --make-pidfile --pidfile /var/run/upstart-yourapp.pid --chdir /var/www/yourapp/--chuid user:usergroup --exec /usr/bin/node index.js >> /var/log/yourapp.upstart.log 2>&1

end script

pre-start script
    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/yourapp.upstart.log
end script

post-stop script
    rm /var/run/upstart-ghost.pid
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/yourapp.upstart.log
end script

Но возможно ли это сделать с помощью systemctl?

1 ответ

Я столкнулся с подобной проблемой. Как объясняется здесь, оказывается, что вы не можете перенаправить вывод непосредственно в ExecStartPre, ExecStart, или же ExecStopPost команды - systemd будет интерпретировать > или же >> в качестве аргументов. Решение состоит в том, чтобы выполнить вашу команду, используя sh -c,

Есть еще одна проблема, с которой я столкнулся при попытке использовать date Команда в моем сценарии systemd: %m это специальный код, ссылающийся на идентификатор машины текущего хоста. Таким образом, для того, чтобы он выводил месяц, вам нужно экранировать знак процента, используя два знака процента (%%). Собирая все это вместе, systemd-версия вышеупомянутых pre и post-скриптов выглядит так:

# Date format same as (new Date()).toISOString() for consistency
ExecStartPre = /bin/sh -c 'echo "[`date -u +%Y-%%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/yourapp.upstart.log'
ExecStopPost = /bin/sh -c 'rm /var/run/upstart-ghost.pid; echo "[`date -u +%Y-%%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/yourapp.upstart.log'
Другие вопросы по тегам