システムサービスログをファイルにリダイレクトする

システムサービスログをファイルにリダイレクトする

Ubuntu 16.04でFlumeをシステムサービスとして実行しようとしています。/etc/systemd/system/flume-ng.service

[Unit]
Description=Apache Flume

[Service]
ExecStart=/usr/bin/nohup /opt/flume/current/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &
ExecStop=/opt/flume/current/bin/flume-ng agent stop

[Install]
WantedBy=multi-user.target

次の行を追加してみました。

StandardOutput=/var/log/flume-ng/log1.log
StandardError=/var/log/flume-ng/log2.log   

これは私には効果がありません。systemctl daemon-reload私は飛びました。systemctl restart flume-ng

これがどのように機能するかを知っている人はいますか?

答え1

リダイレクト

以下はsystemd v236以降にのみ適用されます。

StandardOutput=file:/var/log/flume-ng/log1.log
StandardError=file:/var/log/flume-ng/log2.log

記録によるとここ

systemdがv236より前の場合は、次のものを使用できます。

ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >/var/log/flume-ng/log1.log 2>/var/log/flume-ng/log2.log'

これにより、サービスが再起動されるたびにログファイルの内容全体が上書きされます。

追加

サービスの再起動中にファイルログを保持し、新しいログ行のみを追加するには、次の手順を実行します。

# Works only in systemd v240 and newer!
# (but backported to e.g. RHEL8)
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log

systemdがv240より古い場合は、次のものを使用できます。

ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'

execmy_binaryつまり、フォーキングなしでリダイレクトを設定した後、シェルプログラムがそのプログラムに置き換えられることを意味します。したがって、my_binary自分で実行することとは違いはありませんExecStart=

答え2

ExecStart=/usr/bin/nohup …

これは間違っています。それを削除します。このサービスは対話型ログインセッションで実行されていません。まず、切断信号を送信するための制御端末またはセッションリーダはありません。

ExecStart=… &

これは間違っています。それを削除します。これはシェルスクリプトではありません。 &特別なシェルのような意味がなく、とにかくサービスを開始する誤った方法です。

標準出力=/var/log/flume-ng/log1.log
標準エラー=/var/log/flume-ng/log2.log

これらはすべて間違っていました。これを使用しないでください。システムすでに送りましたサービスプロセスの標準出力とエラーは、サービスユニットでそのような設定なしでログに記録されます。次のコマンドを使用して表示できます。

Journalctl -e -u Flume-ng.service

答え3

上書きせずにファイルにログを記録するには(system.dバージョン240+が必要です):

StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log

または

StandardOutput=append:/var/log/flume-ng/log.log
StandardError=inherit

答え4

出力がまったく出ない場合は、まずスクリプトをテストする必要があります。

たとえば、Pythonスクリプトは出力ストリームをバッファリングします(ただし、コンソールでテストするのではなく、パイプで接続したときのみ)。したがって、バッファがフラッシュされるまでログメッセージは表示されません。

-uこれを防ぐには、スイッチ(python3 -u script)を指定するか、PYTHONUNBUFFERED変数を設定してください。

Environment=PYTHONUNBUFFERED=1

関連情報