2

名前付きパイプを使用して syslog メッセージをトラップしています。次に、次のようなことを行うことで、syslog を簡単に表示できます。

cat /var/log/local3.pipe | grep somefilter
or
grep somefilter /var/log/local3.pipe

これらは両方とも、syslog をコンソールに非常にうまく出力します。ただし、それをファイルにキャプチャしたい場合、何も得られません。

cat /var/log/local3.pipe | grep somefilter >> somefile.log
or
grep somefilter /var/log/local3.pipe >> somefile.log

ファイルは常に 0 バイトのままです。誰かが理由を知っていますか?Red Hat Enterprise Linux 5 を使用しています。ありがとうございます。

追加情報: これを再現したい人のために、ここにコマンドの完全なリストがあります

su
<enter root password>
mkfifo /var/log/local3.pipe
chmod 644 /var/log/local3.pipe
echo "local3.* |/var/log/local3.pipe" >> /etc/syslog.conf
/etc/init.d/syslog restart
exit

次に、1 つの ssh セッションで:

cat /var/log/local3.pipe

および2番目のsshセッションで(「テストしてください」は最初のsshセッションで表示されるはずです

logger -p local3.info "Test it"

次に、最初のセッションでそれをに変更します

cat /var/log/local3.pipe >> somefile.log

さらにいくつかのログをローカル 3 に送信します (メッセージは異なる必要があります)。メッセージが somefile.log に記録されていることを確認します

logger -p local3.info "Test it 2"

次に、最初のセッションでそれをに変更します

cat /var/log/local3.pipe | grep -i test >> somefile.log

ログが somefile.log に出力されないことを確認します

メッセージは最後のメッセージとは異なる必要があることに注意してください。そうでない場合、ロガーはすぐにメッセージを送信しません。

4

1 に答える 1

2

私はあなたの問題を再現することができ、これは私のためにそれを修正します:

cat /var/log/local3.pipe | grep -i --line-buffered test >> somefile.log

その理由は、標準出力が端末を参照する場合 (によるとisatty(3))、ライン バッファリングが使用されるためだと思いますが、ファイルにリダイレクトするとすぐに、libc は通常の固定サイズのバッファリングに切り替わります。したがって、プロセスの標準出力バッファがいっぱいになる前、つまりファイルに書き込む理由がなくなるsomefile.log前に調べたに違いありません。grep

行バッファリングを強制する別の方法は次のとおりです。

cat /var/log/local3.pipe | stdbuf -oL grep -i test >> somefile.log

これらすべてについて詳しくは、次の 2 つの優れた記事をご覧ください。

stdbuf(これは、まったく別のこと、つまり小さな世界について今日私に電子メールを送ってきた人によって書かれたことに気づいて面白いです!)

于 2013-03-06T01:41:12.743 に答える