Saída colorida ao rastrear o log de erros do php

3

Eu estou tentando encontrar uma maneira (através de caracteres de escape ou software) para exibir linhas coloridas no meu log de erros php.

Agora mesmo estou lendo a partir deles (ao vivo) com

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

que é ótimo, mas eu adoraria poder error_log() determinadas linhas ficarem vermelhas, por exemplo, sinalizar um erro de autenticação. Existe alguma maneira de fazer isso?

Estou usando o PHP 5.3 no Ubuntu 12.04

    
por Jamie Taylor 03.07.2013 / 15:41

3 respostas

6

Eu escrevi um pequeno script em Perl que altera as cores do texto que correspondem a uma expressão regular definida pelo usuário. Aqui está o script:

#!/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;
}

Se você salvá-lo como color em um diretório que esteja no seu $PATH e torná-lo executável ( chmod +x /usr/bin/color ), poderá colorir linhas de seu log de erros da seguinte forma:

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

Como escrito, o script tem cores predefinidas para 10 padrões diferentes, portanto, dar a ela uma lista separada por vírgulas como no exemplo acima irá colorir cada um dos padrões correspondidos em uma cor diferente.

    
por 03.07.2013 / 16:15
5

Além do roteiro chique do @Terdon com várias cores, aqui está uma possibilidade mais simples - dado que você está satisfeito com apenas uma cor (vermelho):

tail -n 50 -f /var/log/apache2/error.log | grep --color -P 'error|'
  • --color obviamente diz grep para colorir sua saída
  • -P ativa Expressões regulares compatíveis com Perl
  • a única parte complicada é | : esse é o OR lógico, então foo|bar corresponde a "foo" ou sem "erro" simplesmente são impressas (sem qualquer coloração)

Nota: Provavelmente nem todas as versões de grep suportam ambas as opções, --color e -P , mas com um recente GNU grep ele deve funcionar (testado com o GNU grep 2.6.3).

    
por 03.07.2013 / 17:25
4

sed pode ser usado para isso.

apache-log-error.sed (copiar e colar)

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

Executar com:

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

Você pode remover o .* após \[error\] se não quiser que toda a linha seja colorida.

Se você quiser fazer isso na linha de comando, você pode usar

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

Isso pode ser transformado em um alias ou em um shell script por conveniência.

No primeiro exemplo, digitar ^ [[33m em vim requer que você digite Ctrl + v e Escape para incorporar o valor ascii 27 ( mostrado aqui como "^ [") no arquivo. "[33m" pode ser digitado normalmente. No segundo exemplo, '$' \ 033 é algo que você digita normalmente, e bash traduz isso no valor ascii 27.

    
por 03.07.2013 / 18:17