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

Ami*_*ani 298 command-line colors alias highlighting tail

我希望能够跟踪服务器日志文件的输出,该文件包含以下消息:

INFO
SEVERE
Run Code Online (Sandbox Code Playgroud)

等,如果是SEVERE,则以红色显示该行;如果是INFO,则为绿色。我可以为tail帮助我执行此操作的命令设置什么样的别名?

Gil*_*il' 260

尝试multitail ¹。这是 的超泛化tail -f。您可以在单独的窗口中观看多个文件,根据内容突出显示行等。

multitail -c /path/to/log
Run Code Online (Sandbox Code Playgroud)

颜色是可配置的。如果默认配色方案不适合您,请在配置文件中编写您自己的配色方案。例如,multitail -cS amir_log /path/to/log使用以下命令调用~/.multitailrc

colorscheme:amir_log
cs_re:green:INFO
cs_re:red:SEVERE
Run Code Online (Sandbox Code Playgroud)

另一种解决方案,如果你在不方便安装非标准工具的服务器上,结合tail -fsed 或 awk 来添加颜色选择控制序列。这需要tail -f立即刷新其标准输出,即使其标准输出是管道,我不知道是否所有实现都这样做。

tail -f /path/to/log | awk '
  /INFO/ {print "\033[32m" $0 "\033[39m"}
  /SEVERE/ {print "\033[31m" $0 "\033[39m"}
'
Run Code Online (Sandbox Code Playgroud)

或与sed

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

如果您的 sed 不是 GNU sed,请替换\o033为文字转义字符并删除--unbuffered.

另一种可能性是tail -fEmacs shell 缓冲区中运行并使用 Emacs 的语法着色能力。

¹历史网站在2021年初消失了最新版本仍然在许多发行版中提供,如拱桥Debian的

  • @Gilles 在带有 `awk` 代码的 `tail -f` 中,如果字符串没有 *INFO* 和 *SEVERE*,则不会打印该字符串。我怎样才能打印 *remain* 字符串?(字符串不需要着色) (9认同)
  • @本杰明添加`; next` 在右大括号之前跳过进一步处理,并在末尾添加一个新的处理行 `1 {print}`(`1` 表示总是)。 (8认同)
  • @Ali Sed 不太方便,因为它没有转义字符的语法,您需要在脚本中按字面意思使用它或使用 shell 引用方法来处理它。我建议您使用 awk。 (6认同)
  • `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/'` (6认同)

thi*_*ias 142

grc,通用着色器非常酷。

apt-get install grc
Run Code Online (Sandbox Code Playgroud)

做就是了

grc tail -f /var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)

享受!

您还可以在GitHub 上找到它。

  • 这在 nginx 日志上看起来非常糟糕 http://i.imgur.com/aJbIOfL.png (5认同)
  • 这正是我所需要的:轻量级和简单。颜色并不完全适合我的日志类型(自定义日志),但任何颜色都可以让我更轻松地跟踪日志。 (4认同)
  • 我发现它比 multitail 更快更容易着色。刚刚在我的 CentOS 系统上通过源代码快速安装并升级了我的生活。也将安装在我的其他系统上。 (2认同)

ulo*_*sEI 53

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

编辑:

如果您真的希望将整条线涂成红色,您还可以尝试以下操作:

$ tail -f myfile.log | perl -pe 's/.*SEVERE.*/\e[1;31m$&\e[0m/g'
Run Code Online (Sandbox Code Playgroud)

\e[1;31m会给你红色。如果您想要一些黄色,请使用\e[1;33m,并使用绿色\e[1;32m。在\e[0m恢复正常的文本颜色。

  • @BJović Mac 是 Unix。 (2认同)

bag*_*nyi 44

看看lnav,高级日志文件查看器。

导航 导航

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

前:

先美后

后:

漂亮


nic*_*laj 30

您可以使用Rainbow,它根据正则表达式为线条着色:

rainbow --red='SEVERE.*' --green='INFO.*' tail -f my-file.log
Run Code Online (Sandbox Code Playgroud)

它还与预定义的 configs捆绑在一起,例如用于 Tomcat 日志:

rainbow --config=tomcat tail -f my-file.log
Run Code Online (Sandbox Code Playgroud)

(免责声明:我是作者)

  • 我尝试了针对此问题提供的大多数其他解决方案,但 Rainbow 是唯一在 sun、aix、linux、termux、darwin 和 cygwin 上同样有效的解决方案——我每天使用的 6(!) 种环境。所有其他的都至少在某些平台上涉及困难的非便携式构建过程。 (5认同)
  • `rainbow` 很棒。你是作者吗?如果是这样,请使用该属性编辑您的答案。 (3认同)

小智 18

您可以使用colortail

colortail -f /var/log/messages
Run Code Online (Sandbox Code Playgroud)

  • +1 在 Ubuntu 存储库中可用。与 ccze 相比,我喜欢 colortail 的一点是您可以使用 RegEx 自由自定义您的图案。可用颜色:黑色、亮黑色、白色、亮白色、洋红色、亮洋红色、青色、亮青色、绿色、‌ 亮绿色、黄色、亮黄色、红色、亮红色、蓝色、亮蓝色。不幸的是,没有办法设置粗体或其他颜色,如橙色。 (2认同)

mat*_*tdm 13

另请注意,如果您只想查找一个匹配的正则表达式,GNU grep with--color将起作用 - 只需tail通过管道传输您的输出。

  • 如果你说`grep -A9999 -B9999 ` *`regex`*,它将显示所有行,除非你连续有 10,000 行不匹配的行。使用类似`GREP_COLORS="ms=31:sl=33:cx=32" grep -A9999 -B9999 SEVERE` 之类的东西以红色显示单词`SEVERE`,以黄色显示其余的SEVERE行,以及所有其他(非- SEVERE) 线(最多 9999)为绿色。 (6认同)

tom*_*nux 10

要从标准命令(如 )获得彩色输出grep,您应该alias在您的.bashrc

# User specific aliases and functions
alias grep='grep --color=auto'
Run Code Online (Sandbox Code Playgroud)

当您在文件中 grep 某些内容时,您会看到类似这样的内容(但可能是红色的):

[root@linuxbox mydir]# grep "\(INFO\|SEVERE\)" /var/log/logname
此条目是一条信息 
严重此条目是一个警告!
这个条目是一个信息
这个条目是一个信息
严重这个条目是一个警告!

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

[root@linubox mydir]# grep --color=always "\(INFO\|SEVERE\)" /var/log/logname | 尾巴 -f | awk '{ 打印 $1 }'
这个 
严重
这个
这个
严重

如果你想要awk故事的彩色文本有点复杂但更强大,例如:

[root@linubox mydir]# tail -f /var/log/messages | awk '{if ($5 ~ /INFO/) 打印 "\033[1;32m"$0"\033[0m"; else if ($1 ~ /SEVERE/) 打印 "\033[1;31m"$0"\033[0m"; 否则打印 $0}'
此条目是一条信息 
严重 此条目是一个警告!
这是另一个条目
此条目是一个 INFO
这是另一个条目
此条目是一条信息
严重 此条目是一个警告!

每条线都有自己的颜色。

还有许多其他方法可以使用其他工具从 shell 获取彩色文本,其他成员对它们进行了很好的描述。


小智 7

我很喜欢colorex。简单,但令人满意。

tail -f /var/log/syslog | colorex -G '[0-9]{2}:[0-9]{2}:[0-9]{2}' -b $(hostname)
Run Code Online (Sandbox Code Playgroud)

  • 怎么这么简单? (14认同)

小智 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";
}
Run Code Online (Sandbox Code Playgroud)

将其用作:

tail -f *.log | perl colorTail.pl
tail -f *.log -f **/*.log | perl colorTail.pl
Run Code Online (Sandbox Code Playgroud)

注意:您也可以在MobaXTerm上使用它!只需perlMobaXTerm站点下载插件即可