タイムスタンプが追加されたファイルのシステムログ

タイムスタンプが追加されたファイルのシステムログ

ファイルに書き込むシステムサービスがあります。

[Unit]
Description=...

[Service]
ExecStart=/path/to/my_service
StandardOutput=append:/var/log/my_service/log.log
StandardError=append:/var/log/my_service/err_log.log

[Install]
WantedBy=multi-user.target

各行の前に現在のタイムスタンプを追加したいと思います。端末で次のコマンドを使用tsできますmoreutils

/path/to/my_service | /usr/bin/ts '[%Y-%m-%d %H:%M:%S]'

私は試した:

ExecStart=/path/to/my_service | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'

しかし、ログ出力は依然として同じように見えます。

StandardOutputログファイルの前とStandardErrorログファイルの各行の前にタイムスタンプを追加するには?

答え1

これ起動パラメータの実行フルシェル機能はサポートされていません。この説明を参照してくださいコマンドライン部分このページの内容:

構文はシェル構文に触発されましたが、次の段落で説明するメタ文字と拡張のみを理解し、変数は異なる方法で拡張されます。特に、"<"、"<<"、"">"、および">>"を使用したリダイレクト、"|"を使用したパイプ、"&"を使用したバックグラウンドでのプログラム実行、およびその他のシェル構文要素はサポートされていません。

(私の強調)

タスクを実行するには、ラッピングシェルを呼び出します。

ExecStart=/bin/bash -c "/path/to/my_service 2> >(/usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]' >&2) | /usr/bin/ts '[%%Y-%%m-%%d %%H:%%M:%%S]'"

ここでは、stderrを実行タイムスタンプを置き換えるプロセス置換(bashが必要)にリダイレクトし、ts出力をstderrにリダイレクトしてsystemdのStandardErrorがそれをキャッチします。元のコマンドの stdout はパイプライン化され、tssystemd の StandardOutput によるキャプチャのために stdout に送信されます。

関連情報