Sortie couleur lors de la rédaction du journal des erreurs php


3

J'essaie de trouver un moyen (via des caractères d'échappement ou un logiciel) d'afficher des lignes colorées dans mon journal des erreurs php.

En ce moment je lis d'eux (en direct) avec

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

ce qui est génial, mais j'aimerais beaucoup que error_log()certaines lignes soient rouges, par exemple, signaler une erreur d'authentification. Est-ce qu'il y a un moyen de faire ça?

J'utilise PHP 5.3 sur Ubuntu 12.04

Réponses:


6

J'ai écrit un petit script Perl qui modifie les couleurs du texte en fonction d'une expression régulière définie par l'utilisateur. Voici le 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;
}

Si vous enregistrez comme colordans un répertoire qui se trouve dans votre $PATHet le rendre exécutable ( chmod +x /usr/bin/color), vous pouvez colorer les lignes de votre journal des erreurs de la manière suivante:

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

Comme il est écrit, le script a des couleurs prédéfinies pour 10 motifs différents. Vous devez donc lui donner une liste séparée par des virgules, comme dans l'exemple ci-dessus, pour colorier chacun des motifs correspondants dans une couleur différente.

entrez la description de l'image ici


+1 pour un bon script / réponse. J'aimerais ajouter un autre +1 pour invoquer correctement perl via env.
Hennes

J'espère que vous n'avez pas écrit ceci juste pour la question: P Merci, juste ce que je cherchais
Jamie Taylor

5

Outre le script sophistiqué à plusieurs couleurs de @ terdon , voici une possibilité plus simple: si vous êtes satisfait d'une seule couleur (rouge):

tail -n 50 -f /var/log/apache2/error.log | grep --color -P 'error|'
  • --colordit évidemment grepde colorier sa sortie
  • -Pactive les expressions régulières compatibles Perl
  • la seule partie délicate est |: Ceci est le OU logique, donc foo|barcorrespond à "foo" ou "bar". Ici, l'expression régulière est fermée juste après cet opérateur, elle correspond donc à la chaîne vide. De cette façon, les lignes sans "erreur" sont simplement imprimées (sans aucune coloration)

Remarque: Probablement pas toutes les versions de grepsupport les deux options, --coloret -P, mais avec une récente GNU grep il devrait fonctionner (testé avec GNU grep 2.6.3).


+1 pour le |, quelle idée géniale. J'avais utilisé avec greppour cela, mais je pensais que je ne pouvais sélectionner que les lignes correspondantes.
Terdon le

@terdon: Merci, mais c'est vous qui m'avez appris à propos de la chaîne vide en Perl:)
mpy

Peut-être, mais c'est vous qui avez pensé à cette application :)
terdon

4

sed peut être utilisé pour cela.

apache-log-error.sed (copier / coller)

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

Courir avec:

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

Vous pouvez supprimer l’ .*après \[error\]si vous ne voulez pas que toute la ligne soit colorée.

Si vous voulez faire cela en ligne de commande, vous pouvez utiliser

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

Cela peut être transformé en un alias ou un script shell pour plus de commodité.

Dans le premier exemple, taper ^ [[33m dans vim nécessite de taper Ctrl+ vpuis Escaped'intégrer la valeur ascii 27 (indiquée ici par "^ [") dans le fichier. "[33m" peut être tapé normalement. Dans le deuxième exemple, '$' \ 033 est quelque chose que vous tapez normalement et que bash traduit en une valeur ascii 27.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.