it-swarm-vi.com

Làm thế nào để có đuôi -f hiển thị màu đầu ra

Tôi muốn có thể điều chỉnh đầu ra của tệp nhật ký máy chủ có các thông báo như:

INFO
SEVERE

v.v. và nếu đó là SEVERE, hãy hiển thị dòng màu đỏ; nếu đó là INFO, màu xanh lá cây. Loại bí danh nào tôi có thể thiết lập cho lệnh tail sẽ giúp tôi làm điều này?

277
Amir Afghani

Hãy thử đa nhiệm . Đây là một übergeneralization của tail -f. Bạn có thể xem nhiều tệp trong các cửa sổ riêng biệt, tô sáng các dòng dựa trên nội dung của chúng và hơn thế nữa.

multitail -c /path/to/log

Các màu sắc có thể cấu hình. Nếu bảng màu mặc định không phù hợp với bạn, hãy viết riêng của bạn trong tệp cấu hình. Ví dụ: gọi multitail -cS amir_log /path/to/log với những điều sau đây ~/.multitailrc:

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

Một giải pháp khác, nếu bạn đang ở trên máy chủ, nơi không thuận tiện để cài đặt các công cụ không - tiêu chuẩn , là kết hợp tail -f với sed hoặc awk để thêm các chuỗi điều khiển lựa chọn màu. Điều này đòi hỏi tail -f để tuôn ra đầu ra tiêu chuẩn của nó mà không bị trì hoãn ngay cả khi đầu ra tiêu chuẩn của nó là một đường ống, tôi không biết liệu tất cả các triển khai có làm điều này không.

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

hoặc với sed

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

Nếu sed của bạn không GNU sed, hãy thay thế \o033 bởi một ký tự thoát theo nghĩa đen và xóa --unbuffered.

Một khả năng khác là chạy tail -f trong một Emacs Bộ đệm Shell và sử dụng khả năng tô màu cú pháp của Emacs.

grc , colourizer chung khá tuyệt.

apt-get install grc

Cứ làm đi

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

và tận hưởng!

Bạn cũng sẽ tìm thấy nó trên GitHub .

127
thias

Bạn đã xem ccze chưa? Bạn có thể tùy chỉnh màu mặc định của một số từ khóa bằng tùy chọn -c hoặc trực tiếp trong tập tin cấu hình của bạn. Nếu màn hình của bạn bị xóa sau khi tô màu, bạn phải sử dụng tùy chọn -A.

Chỉnh sửa:

Nếu bạn thực sự muốn có dòng hoàn chỉnh được tô màu đỏ, bạn cũng có thể thử tại đây:

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

\e[1;31m sẽ cho bạn màu đỏ. Nếu bạn muốn một chút màu vàng, hãy sử dụng \e[1;33m và để sử dụng màu xanh lá cây \e[1;32m. Các \e[0m khôi phục màu văn bản bình thường.

52
uloBasEI

Hãy xem lnav , trình xem tệp nhật ký nâng cao.

lnavlnav

Nó cũng có thể in các định dạng khác nhau.

Trước:

lnav-before-pretty

Sau:

lnav-pretty

38
bagonyi

Bạn có thể sử dụng Rainbow , tô màu các dòng dựa trên các biểu thức thông thường:

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

Nó cũng đi kèm với cấu hình được xác định trước , ví dụ cho nhật ký Tomcat:

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

(từ chối trách nhiệm: Tôi là tác giả)

25
nicoulaj

Bạn có thể sử dụng colortail :

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

Cũng lưu ý rằng nếu bạn chỉ muốn tìm một kết hợp regex, GNU grep với --color sẽ hoạt động - chỉ cần đưa đầu ra tail của bạn đi qua đó.

12
mattdm

Để có được đầu ra màu từ các lệnh tiêu chuẩn như grep, bạn nên đặt alias trong .bashrc

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

khi bạn grep một cái gì đó trong tệp của bạn, bạn sẽ thấy một cái gì đó như thế này, (nhưng có lẽ là màu đỏ):

[root @ linuxbox mydir] # grep "\ (INFO\| SEVERE \)" /var/log/logname[.__.[this mục này là một THÔNG TINDỮ DỘI mục này là một cảnh báo! [.__.] mục này là một THÔNG TIN[.__.] mục này là một THÔNG TINDỮ DỘI mục này là một cảnh báo!

nếu muốn sử dụng tail hoặc awk và muốn màu đó tồn tại trong một đường ống, thì bí danh là không đủ và bạn nên sử dụng tham số --color=always, ví dụ:

[.__.] [root @ linubox mydir] # grep --color = always "\ (INFO\| SEVERE \)"/var/log/logname | đuôi -f | awk '{in $ 1}' [.__.] này [.__.]DỮ DỘI[.__.] này [.__.] này [.__.]DỮ DỘI

Nếu bạn muốn văn bản màu với awk thì câu chuyện hơi phức tạp một chút nhưng mạnh mẽ hơn, ví dụ:

[root @ linubox mydir] # tail -f/var/log/message | awk '{if ($ 5 ~/INFO /) in "\ 033 [1; 32m" $ 0 "\ 033 [0m"; khác nếu ($ 1 ~/SEVERE /) in "\ 033 [1; 31m" $ 0 "\ 033 [0m"; khác in $ 0} '[.__.] mục này là một THÔNG TINSEVERE mục này là một cảnh báo![.__.] đây là một ENTRY khác [.__.]mục này là một INFO[.__.] đây là một ENTRY khác [.__.]mục này là một INFOSEVERE mục này là một cảnh báo!

với mỗi dòng trong màu sắc riêng của nó.

Có nhiều cách khác để lấy văn bản được tô màu từ Shell bằng các công cụ khác và chúng được mô tả tốt bởi các thành viên khác.

9
tombolinux

Tôi khá thích colorex . Đơn giản, nhưng thỏa mãn.

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

Dựa trên câu trả lời @uloBasEI, tôi đã thử sử dụng ... | Perl ... | Perl ..., nhưng Linux pipe hơi điên và quá chậm. Nếu tôi đặt tất cả các quy tắc chỉ trong một lệnh Perl, thì nó hoạt động tốt.

Ví dụ: tạo tệp PerlcolorTail.pl như dưới đây:

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

Sử dụng nó như:

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

LƯU Ý: bạn cũng có thể sử dụng nó trên MobaXTerm ! Chỉ cần tải xuống Perl trình cắm từ trang web MobaXTerm .

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

Một giải pháp hoạt động để tô màu tất cả các loại văn bản, không chỉ logfiles, là một công cụ Python, ' colout '.

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

Trong đó bất kỳ văn bản nào trong đầu ra của 'my process' khớp với nhóm 1 của regex sẽ được tô màu bằng color1, nhóm 2 với color2, v.v.

Ví dụ:

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

tức là nhóm regex đầu tiên (parens) khớp với ngày ban đầu trong logfile, nhóm thứ hai khớp với a python tên tệp, số dòng và tên hàm và nhóm thứ ba khớp với thông điệp tường trình xuất hiện sau Điều đó trông giống như:

logfile with colored formatting

Lưu ý rằng các dòng hoặc các phần của dòng không khớp với bất kỳ biểu thức chính nào của tôi vẫn được lặp lại, vì vậy đây không phải là 'grep --color' - không có gì được lọc ra khỏi đầu ra.

Rõ ràng điều này đủ linh hoạt để bạn có thể sử dụng nó với bất kỳ quy trình nào, không chỉ là các logfiles. Tôi thường chỉ cần đánh một regex mới bất cứ khi nào tôi muốn tô màu một cái gì đó. Vì lý do này, tôi thích colout hơn bất kỳ công cụ tô màu logfile tùy chỉnh nào, bởi vì tôi chỉ cần học một công cụ, bất kể tôi đang tô màu gì: ghi nhật ký, đầu ra thử nghiệm, cú pháp tô sáng đoạn mã trong thiết bị đầu cuối, v.v.

3
Jonathan Hartley

grc chắc chắn!

tùy chỉnh collors của bạn với regex trong tệp: ~ .grc/conf.tail (hoặc bất kỳ tên nào bạn muốn)

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

dòng lệnh:

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

các kết quả: screenshot

thông tin để định cấu hình grc: https://github.com/manjuraj/config/blob/master/.grc/sample.conf

2
Flavio

Ổ cắm không biết xấu hổ: Tôi đã viết một công cụ có tên TxtStyle có chức năng tương tự như các tùy chọn đã đề cập trước đó. Bạn có thể chạy nó như sau:

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

Bạn cũng có thể xác định kiểu được đặt tên trong tệp cấu hình (~/.txts.conf) và sử dụng nó như vậy:

ifconfig | txts --name ifconfig

(ifconfig style được xác định ngoài hộp)

2
armandino

Tôi đã viết một hàm bash chấp nhận tối đa ba tham số và thực hiện bộ lọc giống như grep trên tệp văn bản và xuất văn bản ra màn hình màu.

Tôi cũng muốn thấy một chức năng đuôi sẽ làm điều này, nhưng chưa tìm thấy một chức năng nào.

Chức năng này cũng có thể được cải thiện - Tôi đánh giá cao bất kỳ trợ giúp nào về cách làm cho nó tốt hơn.

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

chắc chắn rồi !

Tôi đã viết một hàm dài gọi là "egrepi", dựa trên 8 định nghĩa biến màu. Điều này chỉ hoạt động như một chức năng màu "đuôi -f".

1. SetColors

đầu tiên, chức năng biến màu được gọi lúc đầu:


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

và chức năng egrepi, hiệu quả và thanh lịch: chu kỳ màu giữa 8 màu trở lên (nhu cầu của bạn) VÀ được thử nghiệm dưới 3 hệ điều hành unix khác nhau, với các nhận xét:


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

. Cách sử dụng

lệnh | egrepi Word1 .. wordN

1
scavenger

Đối với các mã màu, tôi sẽ sử dụng tput:

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

Xem để tham khảo: man tput

Sau đó:

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

Bạn cũng có thể muốn xem lwatch :

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

1
Michael Krupp

Xuất bản một thời gian trước Node Tiện ích 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