web-dev-qa-db-ja.com

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()がある場合、そこにある可能性があります。

pstartを使用すると、次のように実行できます。

_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

5
robe007

同様の問題が発生しました。説明したように here は、ExecStartPreExecStart、またはExecStopPostコマンド内で出力を直接リダイレクトできないことが判明しました-systemdは、 >または>>を引数として。解決策は、sh -cを使用してコマンドを実行することです。

Systemdスクリプトでdateコマンドを使用しようとしたときに発生した他の問題が1つあります。%mは、現在のホストのマシンIDを参照する特別なコードです。したがって、月を出力するには、2つのパーセント記号(%%)を使用してパーセント記号をエスケープする必要があります。以上をまとめると、上記のプレスクリプトとポストスクリプトの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'
3
Matt Browne