web-dev-qa-db-fra.com

Comment puis-je générer des journaux dans un fichier du contenu d'un service avec SystemD

Eh bien, j'ai un service configuré avec SystemCTL. Ceci est le fichier de configuration:

[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

ce dont j'ai besoin ?:

1) Le ExecStartPre et ExecStopPost pourrait écrire le message 'starting service' Ou 'stopping service' Dans le fichier /var/log/node/myapp.log. Avec la configuration ci-dessus, cela ne fonctionne pas, il n'entraîne que 'Starting Service' >> /var/log/node/myapp.log Et 'Stopping Service' >> /var/log/node/myapp.log À journalctl. (J'ai vérifié avec journalctl -u myapp)

2) J'ai besoin que, à la place des journaux de tous les journaux de l'application, les sorties sur journalctl, puissent produire dans un fichier. Ex: /var/log/node/myapp.log. Je veux dire, si dans mon application, j'ai un console.log(), cela pourrait être là.

Avec PSTART, je peux le faire de cette façon:

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

Mais il est possible de le faire avec SystemCTL?

5
robe007

J'ai rencontré un problème similaire. Comme expliqué ici , il s'avère que vous ne pouvez pas rediriger la sortie directement dans ExecStartPre, ExecStart ou ExecStopPost commandes - SystemD interprétera le > ou >> comme arguments. La solution consiste à exécuter votre commande en utilisant sh -c.

Il y a aussi une autre question que j'ai rencontrée lorsque vous essayez d'utiliser la commande date dans mon script SystemD: %m est un code spécial faisant référence à l'ID de la machine de l'hôte actuel. Donc, afin de pouvoir sortir le mois, vous devez échapper au signe de pourcentage en utilisant deux pour cent de signes (%%). Mettez tout ensemble, la version SystemD de ce qui précède Pre et post-scripts est la suivante:

# 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'
3
Matt Browne