拖尾 php 错误日志时的彩色输出

拖尾 php 错误日志时的彩色输出

我正在尝试找到一种方法(通过转义字符或软件)在我的 php 错误日志中显示彩色线条。

现在我正在阅读他们的直播

tail -n 50 -f /var/log/apache2/error.log

这很棒,但我希望能够将error_log()某些行设为红色,例如,标记身份验证错误。有什么办法吗?

我在 Ubuntu 12.04 上使用 PHP 5.3

答案1

我编写了一个小型 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;
}

如果你将它保存为color目录中的目录$PATH并使其可执行(chmod +x /usr/bin/color),则可以像这样从错误日志中为线条着色:

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

如上所述,脚本已为 10 种不同的图案预定义了颜色,因此,如上例所示,给它一个以逗号分隔的列表,将为每种匹配的图案涂上不同的颜色。

在此处输入图片描述

答案2

此外@terdon 的花哨脚本如果有多种颜色,这里有一个更简单的可能性——假设您只对一种颜色(红色)感到满意:

tail -n 50 -f /var/log/apache2/error.log | grep --color -P 'error|'
  • --color显然告诉grep它的输出颜色
  • -P激活Perl 兼容正则表达式
  • 唯一棘手的部分是|:这是逻辑或,因此foo|bar匹配“foo”或者“bar”。此处正则表达式在此运算符之后关闭,因此它匹配空字符串。这样行没有“错误”只是被打印出来(没有任何颜色)

笔记:可能并非所有版本都grep支持这两个选项,--color-P,但最近的GNU grep它应该可以工作(用 GNU grep 2.6.3 测试)。

答案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/'

为了方便起见,可以将其转换为别名或 shell 脚本。

在第一个例子中,在 vim 中输入 ^[[33m 需要您输入Ctrl+ v,然后Escape才能在文件中嵌入 ASCII 值 27(此处显示为“^[”)。“[33m”可以正常输入。在第二个例子中,'$'\033 是您正常输入的内容,bash 会将其转换为 ASCII 值 27。

相关内容