PHPエラーログに色付きの線を表示する方法を(エスケープ文字またはソフトウェアを使用して)見つけようとしています。
今私は彼らから(ライブで)読んでいます
_tail -n 50 -f /var/log/Apache2/error.log
_
これはすばらしいことですが、たとえば、認証エラーにフラグを立てるなど、特定の行を赤にerror_log()
できるようにしたいと思います。これを行う方法はありますか?
Ubuntu12.04でPHP 5.3を使用しています
ユーザー定義の正規表現に一致するテキストの色を変更する小さな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の異なるパターンに対して事前定義された色があるため、上記の例のようにコンマ区切りのリストを指定すると、一致する各パターンが異なる色で色付けされます。
@ 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でテスト済み)。
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に変換します。