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