it-swarm-ru.tech

Как заставить tail -f показывать цветной вывод

Я хотел бы иметь возможность отслеживать вывод файла журнала сервера, который имеет такие сообщения:

INFO
SEVERE

и т.д., и если это SEVERE, покажите линию красным цветом; если это INFO, зеленым цветом. Какой псевдоним я могу установить для команды tail, которая помогла бы мне сделать это?

277
Amir Afghani

Попробуйте Мультитейл . Это übergeneralization tail -f. Вы можете просматривать несколько файлов в отдельных окнах, выделять строки в зависимости от их содержимого и многое другое.

multitail -c /path/to/log

Цвета настраиваются. Если цветовая схема по умолчанию у вас не работает, напишите свою собственную в файле конфигурации. Например, позвоните multitail -cS amir_log /path/to/log со следующим ~/.multitailrc:

colorscheme:amir_log
cs_re:green:INFO
cs_re:red:SEVERE

Другое решение, если вы находитесь на сервере, где неудобно устанавливать не - стандартные инструменты, - это объединить tail -f с помощью sed или awk для добавления последовательностей управления выбором цвета. Это требует tail -f чтобы очистить свой стандартный вывод без задержки, даже если его стандартный вывод - труба, я не знаю, все ли реализации делают это.

tail -f /path/to/log | awk '
  /INFO/ {print "\033[32m" $0 "\033[39m"}
  /SEVERE/ {print "\033[31m" $0 "\033[39m"}
'

или с sed

tail -f /path/to/log | sed --unbuffered \
    -e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' \
    -e 's/\(.*SEVERE.*\)/\o033[31m\1\o033[39m/'

Если ваш sed не GNU sed, замените \o033 с помощью буквального escape-символа и удалите --unbuffered.

Еще одна возможность - запустить tail -f в буфере оболочки Emacs и использовать возможности окраски синтаксиса Emacs.

245

grc , универсальный краситель довольно крутой.

apt-get install grc

Просто делать

grc tail -f /var/log/Apache2/error.log

и наслаждаться!

Вы также найдете его на GitHub .

127
thias

Вы смотрели на ccze ? У вас есть возможность настроить цвета по умолчанию для некоторых ключевых слов, используя параметр -c или непосредственно в вашем файле конфигурации. Если ваш экран очищается после окраски, вы должны использовать опцию -A.

Edit:

Если вы действительно хотите, чтобы вся линия была окрашена в красный цвет, вы также можете попробовать следующее:

$ tail -f myfile.log | Perl -pe 's/.*SEVERE.*/\e[1;31m$&\e[0m/g'

\e[1;31m даст вам красный цвет. Если вы хотите немного желтого, используйте \e[1;33m, а для зеленого использования \e[1;32m. \e[0m восстанавливает нормальный цвет текста.

52
uloBasEI

Взгляните на lnav , расширенный просмотрщик файлов журнала.

lnavlnav

Это может также довольно печатать различные форматы.

Перед:

lnav-before-pretty

После:

lnav-pretty

38
bagonyi

Вы можете использовать Rainbow , которая раскрашивает строки на основе регулярных выражений:

Rainbow --red='SEVERE.*' --green='INFO.*' tail -f my-file.log

Он также поставляется в комплекте с предопределенные конфиги , например, для журналов Tomcat:

Rainbow --config=Tomcat tail -f my-file.log

(отказ от ответственности: я автор)

25
nicoulaj

Вы можете использовать colortail :

colortail -f /var/log/messages
16
Kartik M

Также обратите внимание, что если вы просто хотите найти одно соответствующее регулярное выражение, GNU grep с --color будет работать - просто направьте ваш tail вывод через него.

12
mattdm

Чтобы получить цветной вывод от стандартных команд, таких как grep, вы должны установить это alias в вашем .bashrc

# User specific aliases and functions
alias grep='grep --color=auto'

когда вы что-то делаете в своем файле, вы видите что-то вроде этого (но, вероятно, красным):

[root @ linuxbox mydir] # grep "\ (INFO\| SEVERE \)" /var/log/logname
this запись ИНФОРМАЦИЯТЯЖЕЛАЯ ФОРМА Эта запись является предупреждением! 
 Эта запись является ИНФОРМАЦИЯ
 эта запись ИНФОРМАЦИЯТЯЖЕЛАЯ ФОРМА эта запись является предупреждением!

если вы хотите использовать tail или awk и ​​хотите, чтобы цвет сохранился в трубе, то псевдонима недостаточно, и вам следует использовать --color=always параметр, например:

 [root @ linubox mydir] # grep --color = всегда "\ (INFO\| SEVERE \)"/var/log/logname | хвост -f | awk '{print $ 1}' 
 this 
ТЯЖЕЛАЯ ФОРМА
это это
ТЯЖЕЛАЯ ФОРМА

Если вы хотите цветной текст с awk, история будет немного сложной, но более мощной, например:

[root @ linubox mydir] # tail -f/var/log/messages | awk '{if ($ 5 ~/INFO /) print "\ 033 [1; 32m" $ 0 "\ 033 [0m"; иначе if ($ 1 ~/SEVERE /) print "\ 033 [1; 31m" $ 0 "\ 033 [0m"; иначе выведите $ 0} '
 Эта запись ИНФОРМАЦИЯSEVERE эта запись является предупреждением!
 это еще один ВХОД 
эта запись является ИНФО
 это еще один ВХОД 
эта запись является ИНФОSEVERE эта запись является предупреждением!

с каждой линией в своем собственном цвете.

Существует много других способов получения цветного текста из Shell с помощью других инструментов, и они хорошо описаны другими участниками.

9
tombolinux

Мне очень нравится colorex . Просто, но сытно.

tail -f /var/log/syslog | colorex -G '[0-9]{2}:[0-9]{2}:[0-9]{2}' -b $(hostname)
7
Brian M. Hunt

Основываясь на ответе @uloBasEI, я попытался использовать ... | Perl ... | Perl ..., но Linux pipe немного сумасшедший и слишком медленный. Если я добавлю все правила только в одну команду Perl, она будет работать нормально.

Например, создайте файл PerlcolorTail.pl, как показано ниже:

#!/usr/bin/Perl -w

while(<STDIN>) {
    my $line = $_;
    chomp($line);
    for($line){
        s/==>.*<==/\e[1;44m$&\e[0m/gi; #tail multiples files name in blue background
        s/.*exception.*|at .*/\e[0;31m$&\e[0m/gi;  #Java errors & stacktraces in red
        s/info.*/\e[1;32m$&\e[0m/gi; #info replacement in green
        s/warning.*/\e[1;33m$&\e[0m/gi; #warning replacement in yellow
    }
    print $line, "\n";
}

Используйте это как:

tail -f *.log | Perl colorTail.pl
tail -f *.log -f **/*.log | Perl colorTail.pl

ПРИМЕЧАНИЕ: вы также можете использовать его на MobaXTerm ! Просто загрузите плагин Perl с сайта MobaXTerm .

6
surfealokesea
tail -f /var/log/logname | source-highlight -f esc -s log
3
user5771

Одним из решений, которое работает для раскрашивания всех видов текста, а не только лог-файлов, является Python, ' colout '.

pip install colout
myprocess | colout REGEX_WITH_GROUPS color1,color2... [attr1,attr2...]

Где любой текст в выводе 'myprocess', который соответствует группе 1 регулярного выражения, будет окрашен в color1, группа 2 в color2 и т.д.

Например:

tail -f /var/log/mylogfile | colout '^(\w+ \d+ [\d:]+)|(\w+\.py:\d+ .+\(\)): (.+)$' white,black,cyan bold,bold,normal

т.е. первая группа регулярных выражений (parens) совпадает с начальной датой в файле журнала, вторая группа соответствует python имя файла, номер строки и имя функции, а третья группа соответствует сообщению журнала, которое следует после это выглядит так:

logfile with colored formatting

Обратите внимание, что строки или части строк, которые не соответствуют ни одному из моих регулярных выражений, все еще отражаются, так что это не похоже на 'grep --color' - ничего не отфильтровано из вывода.

Очевидно, что это достаточно гибко, так что вы можете использовать его с любым процессом, а не только с файлами журналов. Обычно я просто запускаю новое регулярное выражение на лету, когда хочу что-то раскрасить. По этой причине я предпочитаю colout любому пользовательскому инструменту окраски лог-файлов, потому что мне нужно изучить только один инструмент, независимо от того, что я раскрашиваю: ведение журнала, тестовый вывод, подсветка синтаксиса, фрагменты кода в терминале и т.д.

3
Jonathan Hartley

grc точно!

настройте ваши сборщики с помощью регулярных выражений в файле: ~ .grc/conf.tail (или любое другое имя)

regexp=.*(select .*)$
colours=unchanged,cyan
=====
regexp=.*(update .*)$
colours=unchanged,bold yellow
=====
regexp=.*(insert .*)$
colours=unchanged,bold yellow
=====
regexp=.*(emp=\d+).*
colours=unchanged,reverse green
=====
regexp=.*http.*/rest/contahub.cmds.(.*?)/(\w*).*$
colours=unchanged,green,Magenta
=====
regexp=.*http.*/M/.*\.(.*?Facade)/(\w*).*$
colours=unchanged,underline green,underline Magenta

командная строка:

grc -c conf.tail tail -f log/Tomcat/catalina.out

результаты: screenshot

информация для настройки grc: https://github.com/manjuraj/config/blob/master/.grc/sample.conf

2
Flavio

Бесстыдный плагин: я написал инструмент под названием TxtStyle , который делает что-то похожее на опции, упомянутые ранее. Вы можете запустить его следующим образом:

tail -f /var/log/syslog | txts --regex '\d+'

Вы также можете определить именованные стили в файле конфигурации (~/.txts.conf) и используйте его так:

ifconfig | txts --name ifconfig

(ifconfig стиль определен из коробки)

2
armandino

Я написал функцию bash, которая принимает до трех параметров и выполняет grep-подобный фильтр текстового файла и выводит текст на экран в цвете.

Я также хотел бы видеть функцию хвоста, которая бы делала это, но еще не нашла ее.

Эта функция также может быть улучшена - я буду признателен за любую помощь, как сделать ее лучше.

function multigrep(){

    #THIS WORKS - Recreate this, using input parameters
    #sed -En '/(App)|(Spe)/p' ./flashlog.txt;

    filename="/Users/stevewarren/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt";
    paramString="";

    for element in "[email protected]"
        do
            #echo $element;
            paramString="$paramString($element)|";
        done

    #TRIM FINAL | OFF PARAMSTRING
    paramString=${paramString:0:${#paramString}-1};

    #CREATE SED EXPRESSION - '/($1)|($2)|(...)/p'
    paramString="'/$paramString/p'";

    #CREATE SED FUNCTION, CALL ON FILE
    paramString="sed -En $paramString ./flashlog.txt"

    echo $paramString;
    echo "${txtbld}$(tput setaf 7)" > ./flashlog_output.txt;
    eval $paramString >> ./flashlog_output.txt;
    echo >> ./flashlog_output.txt;
    #cat ./flashlog_output.txt;

    cat ./flashlog_output.txt | while read LINE
    do

        [[  $1 && ${1-x} ]] && 
            if grep -q $1 <<<$LINE; then
                echo "$(tput setaf 3)$LINE"
            fi

        [[  $2 && ${2-x} ]] && 
            if grep -q $2 <<<$LINE; then
                echo "$(tput setaf 7)$LINE"
            fi


        [[  $3 && ${3-x} ]] && 
            if grep -q $3 <<<$LINE; then
                echo "$(tput setaf 6)$LINE"
            fi

    done
}
1
Steve Warren

конечно !

Я долго писал функцию "egrepi", основанную на 8 определениях цветовых переменных. Это работает ТОЛЬКО в виде цветной функции "tail -f".

1. SetColors

во-первых, функция цветовых переменных, вызываемая сначала:


setColors ()
{
set -a
which printf >/dev/null 2>&1 && print=printf || print=print # Mandriva doesn't know about printf

hide='eval tput civis'
show='eval tput cnorm'
CLS=$(tput clear)
bel=$(tput bel)

case ${UNAME} in
AIX)
# text / foreground
N=$(${print} '\033[1;30m')
n=$(${print} '\033[0;30m')
R=$(${print} '\033[1;31m')
r=$(${print} '\033[0;31m')
G=$(${print} '\033[1;32m')
g=$(${print} '\033[0;32m')
Y=$(${print} '\033[1;33m')
y=$(${print} '\033[0;33m')
B=$(${print} '\033[1;34m')
b=$(${print} '\033[0;34m')
M=$(${print} '\033[1;35m')
m=$(${print} '\033[0;35m')
C=$(${print} '\033[1;36m')
c=$(${print} '\033[0;36m')
W=$(${print} '\033[1;37m')
w=$(${print} '\033[0;37m')
END=$(${print} '\033[0m')

# background
RN=$(${print} '\033[6;40m')
Rn=$(${print} '\033[40m')
RR=$(${print} '\033[6;41m')
Rr=$(${print} '\033[41m')
RG=$(${print} '\033[6;42m')
Rg=$(${print} '\033[42m')
RY=$(${print} '\033[6;43m')
Ry=$(${print} '\033[43m')
RB=$(${print} '\033[6;44m')
Rb=$(${print} '\033[44m')
RM=$(${print} '\033[6;45m')
Rm=$(${print} '\033[45m')
RC=$(${print} '\033[6;46m')
Rc=$(${print} '\033[46m')
RW=$(${print} '\033[6;47m')
Rw=$(${print} '\033[47m')

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)
;;
*)
# text / foreground
n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)

HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)

# background
Rn=$(tput setab 0)
Rr=$(tput setab 1)
Rg=$(tput setab 2)
Ry=$(tput setab 3)
Rb=$(tput setab 4)
Rm=$(tput setab 5)
Rc=$(tput setab 6)
Rw=$(tput setab 7)
RN=$(tput setab 8)
RR=$(tput setab 9)
RG=$(tput setab 10)
RY=$(tput setab 11)
RB=$(tput setab 12)
RM=$(tput setab 13)
RC=$(tput setab 14)
RW=$(tput setab 15)
;;
esac

BLUEf=${B}
BLUE=${b}
REDf=${R}
RED=${r}
GREENf=${G}
GREEN=${g}
YELLOWf=${Y}
YELLOW=${y}
MANGENTAf=${M}
MANGENTA=${m}
WHITEf=${W}
WHITE=${w}
CYANf=${C}
CYAN=${c}

OK="${RG}${n}OK${END}"
KO="${RR}${n}KO${END}"
NA="${N}NA${END}"

COLORIZE='eval sed -e "s/{END}/${END}/g" -e "s/{HIGH}/${HIGH}/g" -e "s/{SMUL}/${SMUL}/g" -e "s/{RMUL}/${RMUL}/g" -e "s/{BLINK}/${BLINK}/g" -e "s/{REVERSE}/${REVERSE}/g" -e "s/{REVERSO}/${REVERSO}/g"'
LOWS=' -e "s/{n}/${n}/g" -e "s/{r}/${r}/g" -e "s/{g}/${g}/g" -e "s/{y}/${y}/g" -e "s/{b}/${b}/g" -e "s/{m}/${m}/g" -e "s/{c}/${c}/g" -e "s/{w}/${w}/g"'
HIGHS=' -e "s/{N}/${N}/g" -e "s/{R}/${R}/g" -e "s/{G}/${G}/g" -e "s/{Y}/${Y}/g" -e "s/{B}/${B}/g" -e "s/{M}/${M}/g" -e "s/{C}/${C}/g" -e "s/{W}/${W}/g"'
REVLOWS=' -e "s/{Rn}/${Rn}/g" -e "s/{Rr}/${Rr}/g" -e "s/{Rg}/${Rg}/g" -e "s/{Ry}/${Ry}/g" -e "s/{Rb}/${Rb}/g" -e "s/{Rm}/${Rm}/g" -e "s/{Rc}/${Rc}/g" -e "s/{Rw}/${Rw}/g"'
REVHIGHS=' -e "s/{RN}/${RN}/g" -e "s/{RR}/${RR}/g" -e "s/{RG}/${RG}/g" -e "s/{RY}/${RY}/g" -e "s/{RB}/${RB}/g" -e "s/{RM}/${RM}/g" -e "s/{RC}/${RC}/g" -e "s/{RW}/${RW}/g"'
# COLORIZE Usage:
# command |${COLORIZE} ${LOWS} ${HIGHS} ${REVLOWS} ${REVHIGHS}

set +a
}

2. Egrepi

и функция egrepi, эффективная и элегантная: циклическое изменение цвета между 8 и более цветами (вашими потребностями) И протестировано под 3 разными ОС Unix с комментариями:


# egrepi() egrep with 8 REVERSE cyclic colorations on regexps almost like egrep
# egrepi 
# current script will work for KSH88, KSH93, bash 2+, zsh, under AIX / Linux / SunOS
egrepi ()
{
args=$*
# colorList=wBcgymrN                                                # KSH93 or bash 3+, not for AIX
# set -A color                                                  # needed with older sh
color[0]=$Rw; color[1]=$RB; color[2]=$Rc; color[3]=$Rg; color[4]=$Ry; color[5]=$Rm; color[6]=$Rr; color[7]=$RN; # this is the only one AIX solution
i=0
unset argsToGrep argsSedColor argsPerlColor

for arg in ${args}
do
    [ "${arg}" == "." ] && arg=\\.                              # if you wanna grep "."
    # color=R${colorList:((${RANDOM: -1:1})):1}                     # bash RANDOMized colors
    # color=R${colorList:$i:1} && let i++ && ((i==8)) && i=0                # KSH93 or bash 3+, not for AIX
    argsToGrep="${argsToGrep}${argsToGrep:+|}${arg}"
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${!color}&${w}#gI"            # AIX KSH88 do not recognise this fucking variable double expansion
    # argsSedColor="${argsSedColor} -e s#${arg}#$n${color[$i]}&${w}#gI"         # AIX neither do include sed with Ignore case
    argsPerlColor="${argsPerlColor}${argsPerlColor:+,}s#${arg}#$n${color[$i]}$&${END}#gi"   # So: gotta use Perl
    let i+=1 && ((i==8)) && i=0                             # AIX KSH88 do not recognise "let i++"
done
# egrep -i "${argsToGrep}" | sed ${argsSedColor} | egrep -v "grep|sed"              # AIX sed incompatibility with Ignore case
# (($# > 0)) && (egrep -i "${argsToGrep}" | Perl -p -e ${argsPerlColor}) || cat         # this line colors & grep the words, will NOT act as "tail -f"
(($# > 0)) && (Perl -p -e ${argsPerlColor}) || cat                      # this line just colors the words
}

. Использование

команда | egrepi Word1 .. wordN

1
scavenger

Что касается цветовых кодов, я бы использовал tput:

red=$( tput -Txterm setaf 1 )
norm=$( tput -Txterm sgr0 )
bold=$( tput -Txterm bold )

Смотрите для справки: man tput

Затем:

tail -F myfile.log | sed "s/\(.ERROR.*\)/$red$bold\1$norm/g"
1
Fabien Bouleau

Вы также можете взглянуть на lwatch :

tail -f /var/log/syslog | lwatch --input -

1
Michael Krupp

Публикует некоторое время назад Node Js - log-color-highlight

tail -f file | lch -red error warn -green success
lch -f file -red.bold error warn -underline.bgGreen success
0
gliviu