ファイルに書き込むシステムサービスがあります。
[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 はパイプライン化され、ts
systemd の StandardOutput によるキャプチャのために stdout に送信されます。