2

ファイル test.log があります。非常に大きなログ ファイル。さまざまなレベルのロギングがあります。たとえば、tracedebuginfowarningおよびerror

明らかにtrace、レベルのメッセージは高速でスパム送信されているだけです。traceレベルログなしですべてのメッセージを見たいと思っていました。

だから私はこれをしました:

cat test.log | grep -v "trace"

うまくいきます。

ここで、特定のキーワードに基づいて残りのメッセージをフィルター処理したいと考えていますkeyword1

だから私はこれをしました:

cat test.log | grep -v "trace" | grep "keyword1"

うまくいきます。

今は同じ出力を継続的に取得したいので、に置き換えることを考えましcattail -f

tail -f test.log | grep -v "trace" | grep "keyword1"

しかし、これはうまくいきません。出力がまったく得られません。

私は何を間違っていますか?そして、希望するフィルタリングされた「テール&フォロー」出力を取得するにはどうすればよいですか。

助けてくれてありがとう。

(ところで、私はcygwinを使用しています...それが何らかの形で重要な場合)

4

3 に答える 3

3

バッファリングの問題が発生しています。パフォーマンス上の理由からgrep、 はバッファにかなりの量の出力を保持し、チャンク全体を一度に出力します。つまり、行が入力から読み取られると、さらに行が読み取られるgrep(そして通過する) と、それが stdout に送信されます。tail -f.

多くのgrepバリアントには、ラインバッファモードをオンにするスイッチがあり、各行を個別に出力しますが、パフォーマンスがいくらか低下します。たとえば、この効果を実現GNU grepするオプションがあります。--line-buffered

そのオプション (または のバージョンに適したものgrep) をすべてのgrep呼び出しに追加するだけで、一致する like がログ ファイルに追加されるとすぐに出力が表示されます。

于 2011-02-03T19:13:05.120 に答える
0

コードは正常に動作していますが、バッファリングの遅延が発生しています。そのため、長い間何も表示されず、その後短いバーストで大量のテキストが表示され、さらに待機が続きます。何が起こっているのかについての説明はhttp://perl.plover.com/FAQs/Buffering.htmlを読んでください。

于 2011-02-03T18:57:46.357 に答える
0

tail -fファイルの「新しい着信行」に従います。定期的な出力は、パイプされたgrepコマンドに到達することはありません (少なくとも、tailが終了するまでは到達しません)。

これらのログ ファイルの変更を定期的に「追跡」するには、watch代わりに次を使用することをお勧めします。

watch -n 1 -- 'tail -n 20 test.log | grep -v trace | grep keyword1'

-n 1これにより、ログ ファイルの最後の 20 行が毎秒 ( ) 更新されます。

于 2011-02-03T19:00:26.737 に答える