it-swarm-id.com

Bagaimana agar tail -f menunjukkan output berwarna

Saya ingin dapat mengeklik keluaran file log server yang memiliki pesan seperti:

INFO
SEVERE

dll, dan jika SEVERE, perlihatkan baris dengan warna merah; jika INFO, berwarna hijau. Jenis alias apa yang dapat saya siapkan untuk perintah tail yang akan membantu saya melakukan ini?

277
Amir Afghani

Cobalah multitail . Ini adalah übergeneralisasi tail -f. Anda dapat menonton banyak file di jendela terpisah, menyorot garis berdasarkan kontennya, dan banyak lagi.

multitail -c /path/to/log

Warnanya dapat dikonfigurasi. Jika skema warna default tidak berfungsi untuk Anda, tulis sendiri di file konfigurasi. Misalnya, panggil multitail -cS amir_log /path/to/log Dengan yang berikut ~/.multitailrc:

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

Solusi lain, jika Anda menggunakan server yang merepotkan untuk menginstal alat non - standar , adalah menggabungkan tail -f Dengan sed atau awk untuk menambahkan urutan kontrol pemilihan warna. Ini membutuhkan tail -f Untuk menyiram output standarnya tanpa penundaan bahkan ketika output standarnya adalah sebuah pipa, saya tidak tahu apakah semua implementasi melakukan ini.

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

atau dengan sed

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

Jika sed Anda bukan GNU sed, ganti \o033 Dengan karakter pelarian literal dan hapus --unbuffered.

Namun kemungkinan lain adalah menjalankan tail -f Dalam Emacs Buffer shell dan menggunakan kemampuan pewarnaan sintaks Emacs.

grc , pewarna generik cukup keren.

apt-get install grc

Kerjakan saja

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

dan nikmati!

Anda juga akan menemukannya di GitHub .

127
thias

Sudahkah Anda melihat ccze ? Anda memiliki kemungkinan untuk menyesuaikan warna default beberapa kata kunci menggunakan opsi -c atau langsung di file konfigurasi Anda. Jika layar Anda kosong setelah pewarnaan, Anda harus menggunakan opsi -A.

Edit:

Jika Anda benar-benar ingin memiliki garis lengkap berwarna merah, Anda juga bisa mencoba yang berikut ini:

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

\e[1;31m akan memberi Anda warna merah. Jika Anda ingin warna kuning, gunakan \e[1;33m, dan untuk penggunaan hijau \e[1;32m. \e[0m mengembalikan warna teks normal.

52
uloBasEI

Lihat lnav , penampil file log lanjutan.

lnavlnav

Itu juga bisa mencetak berbagai format.

Sebelum:

lnav-before-pretty

Setelah:

lnav-pretty

38
bagonyi

Anda dapat menggunakan Rainbow , yang mewarnai garis berdasarkan pada ekspresi reguler:

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

Itu juga dibundel dengan konfigurasi yang telah ditentukan , misalnya untuk log Tomcat:

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

(Penafian: Saya penulis)

25
nicoulaj

Anda dapat menggunakan colortail :

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

Perhatikan juga bahwa jika Anda hanya ingin mencari sat regex yang cocok, GNU grep with --color akan bekerja - cukup pipa keluaran tail Anda melalui itu.

12
mattdm

Untuk mendapatkan output berwarna dari perintah standar seperti grep, Anda harus mengatur ini alias di .bashrc Anda

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

ketika Anda menangkap sesuatu di file Anda, Anda melihat sesuatu seperti ini, (tetapi mungkin berwarna merah):

[root @ linuxbox mydir] # grep "\ (INFO\| BEVERE \)" /var/log/logname[.____.[ entri ini adalah INFOBERAT entri ini adalah peringatan! 
 entri ini adalah INFO
 entri ini adalah INFOBERAT entri ini adalah peringatan!

jika ingin menggunakan tail atau awk dan ingin agar warna tersebut bertahan untuk sebuah pipa, maka alias tidak cukup dan Anda harus menggunakan parameter --color=always, misalnya:

 [root @ linubox mydir] # grep --color = always "\ (INFO\| SEVERE \)"/var/log/logname | tail -f | awk '{print $ 1}' 
 this 
BERAT
 ini 
 ini 
BERAT

Jika Anda ingin teks berwarna dengan awk ceritanya sedikit rumit tetapi lebih kuat, misalnya:

[root @ linubox mydir] # tail -f/var/log/messages | awk '{if ($ 5 ~/INFO /) cetak "\ 033 [1; 32m" $ 0 "\ 033 [0m"; selain itu jika ($ 1 ~/BEVERE /) cetak "\ 033 [1; 31m" $ 0 "\ 033 [0m"; lain cetak $ 0} '
 entri ini adalah INFOSEVERE entri ini adalah peringatan!
 ini adalah MASUK lainnya 
entri ini adalah INFO
 ini adalah MASUK lainnya 
entri ini adalah INFOSEVERE entri ini adalah peringatan!

dengan masing-masing garis dalam warnanya sendiri.

Ada banyak cara lain untuk mendapatkan teks berwarna dari Shell dengan alat-alat lain dan mereka dideskripsikan dengan baik oleh anggota lain.

9
tombolinux

Saya sangat suka colorex . Sederhana, namun memuaskan.

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

Berdasarkan jawaban @uloBasEI, saya sudah mencoba menggunakan ... | Perl ... | Perl ..., tetapi pipa Linux menjadi sedikit gila dan terlalu lambat. Jika saya meletakkan semua aturan hanya dalam satu perintah Perl, itu berfungsi dengan baik.

Sebagai contoh, buat file PerlcolorTail.pl seperti di bawah ini:

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

Gunakan sebagai:

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

CATATAN: Anda dapat menggunakannya di MobaXTerm juga! Cukup unduh Perl plug-in dari situs MobaXTerm .

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

Salah satu solusi yang berfungsi untuk mewarnai semua jenis teks, bukan hanya file log, adalah Python alat, ' colout '.

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

Dimana teks dalam output 'myprocess' yang cocok dengan grup 1 regex akan diwarnai dengan color1, group 2 dengan color2, dll.

Sebagai contoh:

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

yaitu grup regex pertama (parens) cocok dengan tanggal awal dalam logfile, grup kedua cocok dengan python nama file, nomor baris dan nama fungsi, dan grup ketiga cocok dengan pesan log yang datang setelah Ini terlihat seperti:

logfile with colored formatting

Perhatikan bahwa garis atau bagian dari garis yang tidak cocok dengan regex saya masih bergema, jadi ini bukan seperti 'grep --color' - tidak ada yang disaring dari output.

Jelas ini cukup fleksibel sehingga Anda dapat menggunakannya dengan proses apa pun, tidak hanya mengekor file log. Saya biasanya hanya menyiapkan regex baru dengan cepat setiap kali saya ingin mewarnai sesuatu. Untuk alasan ini, saya lebih suka colout ke alat pewarnaan logfile khusus, karena saya hanya perlu mempelajari satu alat, terlepas dari apa yang saya warnai: logging, output tes, sintaks menyoroti potongan kode di terminal, dll.

3
Jonathan Hartley

grc pasti!

sesuaikan collors Anda dengan regex di file: ~ .grc/conf.tail (atau nama apa pun yang Anda inginkan)

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

garis komando:

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

hasil: screenshot

info untuk mengkonfigurasi grc: https://github.com/manjuraj/config/blob/master/.grc/sample.conf

2
Flavio

Shameless plug: Saya menulis alat bernama TxtStyle yang melakukan sesuatu yang mirip dengan opsi yang disebutkan sebelumnya. Anda dapat menjalankannya sebagai berikut:

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

Anda juga dapat menentukan gaya yang dinamai dalam file konfigurasi (~/.txts.conf) dan gunakan seperti ini:

ifconfig | txts --name ifconfig

(ifconfig style didefinisikan di luar kotak)

2
armandino

Saya menulis fungsi bash yang menerima hingga tiga parameter dan melakukan filter mirip grep pada file teks, dan menampilkan teks ke layar berwarna.

Saya juga ingin melihat fungsi ekor yang akan melakukan ini, tetapi belum menemukannya.

Fungsi ini juga dapat ditingkatkan - Saya menghargai bantuan apa pun tentang cara membuatnya lebih baik.

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

tentu !

Saya menulis lama pergi fungsi yang disebut "egrepi", berdasarkan definisi variabel 8 warna. Ini berfungsi HANYA disalurkan seperti fungsi berwarna "tail -f".

1. SetColors

pertama, fungsi variabel warna untuk dipanggil pada awalnya:


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

dan fungsi egrepi, efektif dan elegan: siklus warna antara 8 atau lebih warna (kebutuhan Anda) DAN diuji di bawah 3 OS unix yang berbeda, dengan komentar:


# 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
}

. Penggunaan

perintah | egrepi Word1 .. wordN

1
scavenger

Sedangkan untuk kode warna, saya akan menggunakan tput:

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

Lihat untuk referensi: man tput

Kemudian:

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

Anda mungkin juga ingin melihat lwatch :

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

1
Michael Krupp

Terbit beberapa waktu lalu Node Utilitas 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