ログを閲覧するための効率的な環境

ログを閲覧するための効率的な環境

現在はログの表示に使用していますtail -f

ログを表示するより効率的/読みやすい/優れた方法はありますか?

答え1

はい!perl賛成です実用的な抽出と研究言語

shell次のような構文を使用する代わりに、

tail -f file | grep --line-buffered someting

または

tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'

(注:--line-bufferedではgrep-uのように、 はsed固定サイズのブロックによるバッファリング

ログの表示/閲覧にperl言語。

に応じて何を待っているのか...ニーズに正確に一致するように小さなスクリプトを作成する必要があるかもしれません。

perlfaq で、 のような使用可能なサンプルが見つかるかもしれませんperldoc perlfaq5(または をman perlfaq5インストールしていない場合はperldoc、次の質問があります)。Perl で「tail -f」を実行するにはどうすればいいですか?私がこれを撮った場所:

初挑戦

seek(GWFILE, 0, 1);

このステートメントはseek(GWFILE, 0, 1)現在の位置を変更しませんが、ハンドルのファイル終了条件をクリアし、次のステートメントで<GWFILE>Perl が再度何かを読み取ろうとするようにします。

それが機能しない場合は (stdio 実装の機能に依存します)、次のようなものが必要になります。

for (;;) {
    for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
      # search for some stuff and put it into files
    }
    # sleep for a while
    seek(GWFILE, $curpos, 0);  # seek to where we had been
  }

私はすでにこれを特別なケースをトリガーするために何度も使用しました。

デモ

例として、quick and dirty リアルタイムログカウンター試してみてください! (読み取りアクセスが必要です/var/log/syslog;-) :

#!/usr/bin/perl -w
my %counter;

open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );

for ( ; ; ) {
    for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
        $counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
    }
    syswrite STDOUT, sprintf "\r%s\e[K",
      join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
    select undef,undef,undef,1;
    seek( FH, $curpos, 0 );
}

1行生成され、1秒ごとに自動更新され、すべての情報が含まれる。デーモンの名前と、それぞれに対するカウンター:

smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1

答え2

F. Hauri が示唆しているように、出力をフォーマットするには perl を使用できます。

私の使用法では、Glassfish のログを読むために tail のエイリアスを作成しました~/.bashrc。これは非常にシンプルで (1 行)、出力を色分けしてエラー/警告行に下線を付けます。

tail-color() {
    tail $* | perl -p -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;' -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' -e 's/(.*SEVERE.*)/\033[33;41;1m$1\033[0m\007/g'
}
  1. -p: スクリプトをループで囲み、処理された行を出力します
  2. -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'「WARN」を含むすべての行を色付けします
    • \033[エスケープシーケンスを開始します(書式設定を有効にします)
    • 31赤い前景を意味する
    • 43黄色の背景を意味する
    • 1太字を有効にする
    • mエスケープシーケンスを閉じる
    • $1入力行を含む
    • \033[0m行が出力された後、デフォルトのフォーマットを標準に戻す2番目のシーケンスです。
    • \007ビープ音
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'「ERROR」を含むすべての行を色付けします。違いは色に関するものだけです。
    • 31黄色の前景を意味する
    • 43赤い背景を意味する

私の場合、ビジュアルベルをオンに切り替えたので、エラーが発生すると画面が点滅し(スピーカーはビープ音を鳴らしません)、エラー/警告行を非常に迅速に検出できます。

以下の詳細情報を入手できます。

繰り返しになりますが、F. Hauri が回答で説明しているように、perl を使用すると多くのことを実現できるため、必要に応じて独自のログ リーダーを「開発」できます。

関連情報