如何让tail -f显示彩色输出


Answers:


234

试用multitail。这是的ü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义转义字符替换并删除--unbuffered

还有一种可能是tail -fEmacs Shell缓冲区中运行并使用Emacs的语法着色功能。


你怎么能做到这一点sed?(对不起,我很懒,没有自己弄清楚!)但是,请您再加上一个sed例子。
阿里

5
@Ali Sed不太方便,因为它没有转义字符的语法,您需要按原样在脚本中使用它,或者使用shell引用方法来使用它。我建议您使用awk。
吉尔斯

8
@Gilles在您的tail -fwith awk代码中,如果字符串没有INFOSEVERE,则不会打印该字符串。我怎么也可以打印剩余的字符串?(不需要对字符串进行着色)
Benjamin

6
@Benjamin ; next在右括号前添加以跳过进一步的处理,并在末尾添加新的处理行1 {print}1表示始终)。
Gilles 2012年

3
sed --unbuffered -e 's/\(.*FATAL.*\)/\o033[1;31m\1\o033[0;39m/' -e 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*WARN.*\)/\o033[33m\1\o033[39m/' -e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' -e 's/\(.*DEBUG.*\)/\o033[34m\1\o033[39m/' -e 's/\(.*TRACE.*\)/\o033[30m\1\o033[39m/' -e 's/\(.*[Ee]xception.*\)/\o033[1;39m\1\o033[0;39m/'
DmitrySandalov '18年

119

grc,通用着色剂很酷。

apt-get install grc

做就是了

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

享受!

您还将在GitHub上找到它。


2
这正是我所需要的:轻巧而简单。颜色并不完全适合我的日志类型(自定义日志),但是任何颜色都使我更容易遵循日志。
rennat 2011年

对我来说,在Debian错误上出现“ grc”错误是:OSError:[Errno 13]权限被拒绝。另外,它还取决于安装的Python,因此除非您已经拥有Python,否则它并不是轻量级的。例如,我发现“ ccze”的效果要好得多。'tail -f -n 50 /var/log/starbound-server.log | ccze -A'。
Daniel Sokolowski

1
Ubuntu中的grc默认设置对于syslogs或mail.log都显示不好。了解如何对其进行自定义并不容易。
lepe 2014年

1
我发现它比多尾色更容易上色。刚刚通过源代码在我的CentOS系统上进行了快速安装,并改善了我的生活。也将安装在我的其他系统上。
zeeshan 2014年


51

您看过ccze吗?您可以使用该选项-c或直接在配置文件中自定义某些关键字的默认颜色。如果在着色后屏幕仍然清晰,则必须使用option -A

编辑:

如果您确实希望将完整的行用红色显示,则可以尝试以下方法:

$ 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恢复正常的文本颜色。


1
这在Mac上不起作用-我赞成它,因为它在Linux上有效。
阿米尔·阿富汗尼

支持,因为虽然可能没有perl / ansi技巧,但ccze却可以。
Shadur

1
您还可以通过添加\007到正则表达式的末尾来使终端发送警报或“哔声” ,如下所示:perl -pe 's/(ERROR)/\033[31m$1\033[0m\007/g;'。如果您将tmux与配合使用,则效果非常好set -g bell-action any,在这种情况下,如果您将日志拖到另一个窗口中,则每当正则表达式找到匹配项时,该窗口名称都会发出警报。
jonyamo 2012年

@AmirAfghani这是linux / unix SE网站,因此我不确定为什么您认为它可以在mac上运行。
2013年

1
@BЈовићMac是Unix。
克里斯·

34

看一下lnav(高级日志文件查看器)。

lnav lnav

它也可以漂亮地打印各种格式。

之前:

靓丽

后:

不够漂亮


日志分析工具套件的补充非常酷。谢谢你的建议。
Patrik Alienus

24

您可以使用rainbow,它根据正则表达式为行着色:

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

它还与预定义的配置捆绑在一起,例如Tomcat日志:

rainbow --config=tomcat tail -f my-file.log

(免责声明:我是作者)


2
我尝试了提供给该问题的大多数其他解决方案,但是Rainbow是在sun,aix,linux,termux,darwin和cygwin上运行的唯一同等性能的解决方案-我每天都使用6(!)环境。其他所有问题都涉及至少某些平台的困难的非便携式构建过程。
马able

1
rainbow太棒了。你是作者吗?如果是这样,请编辑带有该属性的答案。
主教

是的,抱歉,已编辑
nicoulaj

15

您可以使用colortail

colortail -f /var/log/messages

2
+1在Ubuntu存储库中可用。与ccze相比,我喜欢colortail的是,您可以使用RegEx自由自定义样式。可用颜色:黑色,亮黑色,白色,亮白色,品红色,亮品红色,青色,亮蓝色,绿色,‌鲜绿色,黄色,亮黄色,红色,亮红色,蓝色,亮蓝色。不幸的是,没有办法设置粗体或其他颜色,例如橙色。
lepe 2014年

我想更正一下我以前的评论:“明亮” +颜色包括“粗体”(某些颜色实际上也会看起来更亮)
lepe 2014年

我在Ubuntu 18上尝试了此操作,但没有成功。该设置是多步骤的,并且说明不明确。仍然不确定那是我做错的部分;最后一部分可以更清楚“之后,您可能希望将示例配置文件复制并编辑到其他位置。我将它们放在〜/ .colortail /中”
Dawoodjee

只需安装colortail,apt install colortail它也无需编辑〜/ .colortail /也可以工作。
Kartik M

11

还要注意,如果您只想查找一个匹配的正则表达式,则GNU grep with --color可以使用-只需tail通过该管道输出即可。


OP仅想突出显示输出,而不是对其进行过滤。Grep不会显示不匹配的行...
Coderer 2014年

3
如果您说grep  -A9999  -B9999 regex,它将显示所有行,除非您连续有10,000条不匹配的行。使用类似的方法GREP_COLORS="ms=31:sl=33:cx=32" grep -A9999 -B9999 SEVERESEVERE红色显示单词,其余的SEVERE行以黄色显示,所有其他(非SEVERE)行(最高9999)以绿色显示。
G-Man

您可能需要传递--color=always给grep而不是just --color,这取决于管道的顺序,但是是的,这可以在我的盒子上安装的tail(GNU coreutils)8.27。
汉克·舒尔茨'18

7

要从的标准命令获取彩色输出grep,您应该alias.bashrc

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

当您对文件中的某些内容进行grep时,您会看到类似以下内容(但可能是红色的):

[root @ linuxbox mydir]#grep“ \(INFO \ | SEVERE \)” / var / log / logname
此条目是INFO  
SEVERE该条目是警告!
该条目是一个INFO 
该条目是一个INFO 
SEVERE该条目是警告!

如果要使用tailawk并希望颜色保留到管道中,则别名是不够的,您应该使用--color=always参数,例如:

[root @ linubox mydir]#grep --color =总是“ \(INFO \ | SEVERE \)” / var / log / logname | 尾巴-f | awk'{print $ 1}'
这个 
严重
这个
这个
严重

如果您想awk在故事中添加彩色文本,则有点复杂但功能更强大,例如:

[root @ linubox mydir]#tail -f / var / log / messages | awk'{if($ 5〜/ INFO /)print“ \ 033 [1; 32m” $ 0“ \ 033 [0m”; 否则($ 1〜/ SEVERE /)打印“ \ 033 [1; 31m” $ 0“ \ 033 [0m”; 否则打印$ 0}'
此条目是INFO  
SEVERE该条目是警告!
这是另一个入口
此项是一个信息
这是另一个入口
此条目是INFO 
SEVERE该条目是警告!

每行都有自己的颜色。

还有许多其他方法可以使用其他工具从shell中获取彩色文本,并且其他成员对此也有很好的描述。



6

基于@uloBasEI答案,我尝试使用... | perl ... | perl ...,但是Linux管道有点发疯,而且速度太慢。如果我仅将所有规则放在一个perl命令中,它将正常工作。

例如,创建perl文件colorTail.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上使用它!只需perlMobaXTerm网站下载插件。


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

7
source-highlight不是一个广泛安装的命令,因此您至少应提供一个指向项目站点的链接。
吉尔斯

可在Fedora的19
sjas

和Ubuntu 12.10。
sjas 2013年

看起来很好。与该列表中的其他文件相比,它是一个很大的包裹(26MB)。它支持多种语言。可以对它进行自定义,修改位于/usr/share/source-highlight/*.lang(Ubuntu)的配置文件。如果您需要简单的东西,请使用ccze或colortail。
lepe 2014年

看起来它取决于增强,大约462MB
ecsos 2014年

3

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

例如,第一个正则表达式组(括号)与日志文件中的初始日期匹配,第二个正则表达式组与python文件名,行号和函数名匹配,而第三组则匹配之后的日志消息。看起来像:

彩色格式的日志文件

请注意,与我的任何正则表达式都不匹配的行或部分行仍在回显,所以这与'grep --color'并不一样-输出中没有任何内容被过滤掉。

显然,这足够灵活,您可以将其用于任何进程,而不仅仅是尾随日志文件。我通常在想着色任何东西时,随时随地快速制作一个新的正则表达式。因此,我喜欢使用colout而不是任何自定义日志文件着色工具,因为无论我要着色什么,我都只需要学习一种工具:日志记录,测试输出,终端中代码的语法高亮片段等。


1
我还没有看到一个修改源日志文件的答案
Dani_l

@Dani_l对了!在撰写本文时,我一定是在这个问题和类似的问题之间来回切换,这使我很困惑,对于这个问题,许多答案都与如何配置日志记录有关,以便将ANSI字符直接写入日志文件本身。我将从答复中删除该投诉。
乔纳森·哈特利

2

无耻的插件:我编写了一个名为TxtStyle的工具,该工具的功能与前面提到的选项类似。您可以按以下方式运行它:

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

您还可以在配置文件(~/.txts.conf)中定义命名样式,并按如下方式使用它:

ifconfig | txts --name ifconfig

ifconfig样式定义为开箱即用)


1

我编写了一个bash函数,该函数最多接受三个参数,并对文本文件执行类似grep的过滤器,然后将文本以彩色输出到屏幕。

我还希望看到可以执行此操作的tail函数,但尚未找到它。

此功能也可以得到改进-对于如何使其变得更好,我将不胜感激。

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 "$@"
        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

当然!

我根据8种颜色变量定义编写了一个名为“ egrepi”的函数。此功能仅通过管道传递,就像“ 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
}

3.用法

命令 egrepi word1 .. wordN



1

肯定是grc!

使用〜.grc / conf.tail文件中的正则表达式自定义您的collors(或您想要的任何名称)

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

结果: 屏幕截图

配置grc的信息:https : //github.com/manjuraj/config/blob/master/.grc/sample.conf


1

至于颜色代码,我将使用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"

万分谢意。具有标准外壳功能,就像魅力一样。
vquintans

0

前一段时间发布Node Js实用程序-log-color-highlight

tail -f file | lch -red error warn -green success
lch -f file -red.bold error warn -underline.bgGreen success
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.