3

Я пытаюсь найти способ (через escape-символы или программное обеспечение) для отображения цветных линий в моем журнале ошибок php.

Прямо сейчас я читаю от них (в прямом эфире) с

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

это здорово, но я бы хотел, чтобы в error_log() некоторые строки были красными, например, помечали ошибку аутентификации. Есть какой-либо способ сделать это?

Я использую PHP 5.3 на Ubuntu 12.04

3 ответа3

6

Я написал небольшой скрипт на 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 различных шаблонов, поэтому, предоставив ему список через запятую, как у меня в приведенном выше примере, каждый из шаблонов будет окрашен в другой цвет.

5

В дополнение к причудливому сценарию @ 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).

4

Для этого можно использовать 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/'

Это может быть превращено в псевдоним или сценарий оболочки для удобства.

В первом примере для ввода ^ [[33m в vim) необходимо нажать Ctrl+v, а затем Escape, чтобы встроить в файл значение ascii 27 (показанное здесь как «^ [»). «[33m» можно набрать как обычно. Во втором примере '$'\033 - это то, что вы вводите как обычно, и bash преобразует это в значение ascii 27.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .