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'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.
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).
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.
Outre le script sophistiqué à plusieurs couleurs de @ terdon , voici une possibilité plus simple: si vous êtes satisfait d'une seule couleur (rouge):
--color
dit évidemmentgrep
de colorier sa sortie-P
active les expressions régulières compatibles Perl|
: Ceci est le OU logique, doncfoo|bar
correspond à "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
grep
support les deux options,--color
et-P
, mais avec une récente GNU grep il devrait fonctionner (testé avec GNU grep 2.6.3).la source
|
, quelle idée géniale. J'avais utilisé avecgrep
pour cela, mais je pensais que je ne pouvais sélectionner que les lignes correspondantes.:)
sed peut être utilisé pour cela.
apache-log-error.sed (copier / coller)
Courir avec:
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
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.
la source