web-dev-qa-db-ja.com

PHPエラーログをテーリングするときの色付き出力

PHPエラーログに色付きの線を表示する方法を(エスケープ文字またはソフトウェアを使用して)見つけようとしています。

今私は彼らから(ライブで)読んでいます

_tail -n 50 -f /var/log/Apache2/error.log_

これはすばらしいことですが、たとえば、認証エラーにフラグを立てるなど、特定の行を赤にerror_log()できるようにしたいと思います。これを行う方法はありますか?

Ubuntu12.04でPHP 5.3を使用しています

3
Jamie Taylor

ユーザー定義の正規表現に一致するテキストの色を変更する小さなPerlスクリプトを作成しました。スクリプトは次のとおりです。

#!/usr/bin/env Perl
use Getopt::Std;
use strict;
use Term::ANSIColor; 

my %opts;
getopts('hic:l:',\%opts);
    if ($opts{h}){
      print<<EoF; 
Use -l to specify the pattern(s) to highlight. To specify more than one 
pattern use commas. 

-l : A Perl regular expression to be colored. Multiple expressions can be
     passed as comma separated values: -l foo,bar,baz
-i : makes the search case sensitive
-c : comma separated list of colors;

EoF
      exit(0);
    }

my $case_sensitive=$opts{i}||undef;
my @color=('bold red','bold blue', 'bold yellow', 'bold green', 
           'bold Magenta', 'bold cyan', 'yellow on_Magenta', 
           'bright_white on_red', 'bright_yellow on_red', 'white on_black');
if ($opts{c}) {
   @color=split(/,/,$opts{c});
}
my @patterns;
if($opts{l}){
     @patterns=split(/,/,$opts{l});
}
else{
    $patterns[0]='\*';
}

# Setting $| to non-zero forces a flush right away and after 
# every write or print on the currently selected output channel. 
$|=1;

while (my $line=<>) 
{ 
    for (my $c=0; $c<=$#patterns; $c++){
    if($case_sensitive){
        if($line=~/$patterns[$c]/){
           $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ge;
        }
    }
    else{
        if($line=~/$patterns[$c]/i){
          $line=~s/($patterns[$c])/color("$color[$c]").$1.color("reset")/ige;
        }
      }
    }
    print STDOUT $line;
}

$PATH内のディレクトリにcolorとして保存し、実行可能(chmod +x /usr/bin/color)にすると、エラーログから次のように線に色を付けることができます。

tail -f -n 50 /var/log/Apache2/error.log | color -l "\[error\]","\[notice\]"

記述されているように、スクリプトには10​​の異なるパターンに対して事前定義された色があるため、上記の例のようにコンマ区切りのリストを指定すると、一致する各パターンが異なる色で色付けされます。

enter image description here

6
terdon

@ terdonのファンシースクリプト 複数の色に加えて、より単純な可能性があります-単一の色(赤)だけで満足している場合:

tail -n 50 -f /var/log/Apache2/error.log | grep --color -P 'error|'
  • --colorは明らかにgrepに出力に色を付けるように指示します
  • -Pアクティブ化 Perl互換正規表現
  • 唯一注意が必要なのは|:これは論理ORなので、foo|barは「foo」または「bar」のいずれかに一致します。ここでは、この演算子の直後に正規表現が閉じられているため、空の文字列と一致します。そうすれば、行without "error"が単に印刷されます(色付けなし)

注:おそらく、grepのすべてのバージョンが両方のオプションをサポートしているわけではありません。--colorおよび-Pですが、最近のGNU grepでは機能するはずです(GNU grep 2.6.3でテスト済み)。

5
mpy

sed これに使用できます。

Apache-log-error.sed(コピーアンドペースト)

s/\[notice\]/[33m&[30m/
s/\[error\].*/[31m&[30m/

実行:

cat error.log | sed -f Apache-log-error.sed

行全体に色を付けたくない場合は、.*の後に\[error\]を削除できます。

コマンドラインでこれを実行したい場合は、次を使用できます

cat error.log | sed -e 's/\[notice\]/\'$'\033[33m&\033[30m/' -e 's/\[error\].*/\'$'\033[31m&\033[30m/'

これは、便宜上、エイリアスまたはシェルスクリプトに変換できます。

最初の例では、vimに^ [[33mと入力するには、次のように入力する必要があります。 Ctrl+v その後 Escape ファイルにASCII値27(ここでは「^ [」として表示)を埋め込みます。 「[33m」は普通に入力できます。 2番目の例では、 '$'\033は通常入力するものであり、bashはそれをASCII値27に変換します。

4
Chad Skeeters