Назад | Перейти на главную страницу

Как я могу вывести журналы в файл из содержимого службы с помощью 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?

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

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

# 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'