stdoutに出力される複数のサードパーティプロセスを開始するシステムサービスがあります。システムログで特定のプロセスのログが何であるかを簡単に確認する方法はありますか?
最近のsystemdについてもっと深く掘り下げ、ロギングに関する質問があります。man systemd-journald.service
指摘した:
libc syslog(3)呼び出しを介して、ユーザープロセスから受信したログ情報に基づいて構造化インデックスログを生成して維持します。システムサービスの標準入力と標準エラーまたはデフォルトのAPIを介して。
シンプルなサービスを作りました。
[Service]
ExecStart=/home/myself/logtest/runlogtest
そして、スクリプトにいくつかのプロセスを呼び出すようにします。
#!/bin/bash
...
/home/myself/logtest/app1 &
/home/myself/logtest/app2 &
...
サービスの実行中に、次のコマンドを使用してメッセージを受信します。
journalctl -f | grep runlogtest
出力は次のとおりです(この例では、app1は「A」を出力し、app2は「B」を出力します)。
Aug 07 14:22:04 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:07 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:10 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:11 localhost.localdomain runlogtest[8742]: A
Aug 07 14:22:13 localhost.localdomain runlogtest[8742]: B
Aug 07 14:22:15 localhost.localdomain runlogtest[8742]: A
とにかく、「A」ログはapp1からのもので、「B」メッセージはapp2からのものであることがわかりますか?
今すぐ見ることができる唯一の解決策は次のとおりです。
- 各アプリケーションを独自のサービスで管理します(これは避けたい)。
- プロセスのラッパーを作成し、そのstdoutをキャプチャしてsyslogを介してログにポンピングします。
答え1
プロセスのラッパーを作成し、そのstdoutをキャプチャしてsyslogを介してログにポンピングします。
これらのラッパーはすでに存在し、次のように呼び出されます。systemd-cat
。
次のように使用できます。
systemd-cat -t app1 /home/myself/logtest/app1 &
systemd-cat -t app2 /home/myself/logtest/app2 &
パラメータは、-t
syslog識別子と同様(同等)の任意の識別文字列です。
systemd-cat
次のようにシェルパイプラインでも使用できます。
/home/myself/logtest/app1 |& systemd-cat -t app1 &
(これは|&
stdoutとstderrをパイプするために使用されるbash構造です。)
ただし、追加のプロセスの作成と記録されたすべてのデータの追加コピーの作成を防ぐため、最初の形式が優れています。