着色问题

着色问题

我想更改使用 wim、less 或其他方式显示大(约 6000 行)日志文件的方式,以简化问题检查。

我想根据模式突出显示日志的某些行(即,,error... )和/或隐藏其他一些行。warninginfo

我可以使用哪些工具?我只需要一个 shell 脚本吗?重要的是,在该过程之后,我可以使用 less、vim、... 读取输出来执行搜索操作!

编辑:日志的一小部分:

2016/10/25 12:19:24.403355 INFO <ServiceManager.cpp#2614 TID#3> Security object has NOT been parsed
2016/10/25 12:19:24.403369 INFO <ServiceManager.cpp#1263 TID#3> Service object sequence started
2016/10/25 12:19:24.403372 DBG <ServiceManager.cpp#1276 TID#3> preinvoke succeeded

答案1

我会推荐一个 shell 脚本,基于awk类似 Valentin B. 的解决方案:

$ cat colorize
awk '
function color(c,s) {
        printf("\033[%dm%s\033[0m\n",30+c,s)
}
/error/ {color(1,$0);next}
/success/ {color(2,$0);next}
/warning/ {color(3,$0);next}
/INFO/ {color(4,$0);next}
/DBG/ {color(5,$0);next}
{print}
' $1

为了能够交互式地查看彩色输出,我将less在原始模式下使用,例如:

colorize mylog.txt | less -R

答案2

awk正如其他答案中提到的,绝对是首先要达到的工具。

但从长远来看,它并不是唯一的工具。

AL 兰伯特logtool专门为后处理日志文件而设计,并且有一个复杂的(可惜文档记录得很差)配置系统,允许将一个充满正则表达式的文件分配给 13 种颜色中的每一种。

猫 *.log |日志工具

它的特点是可以理解具有 TAI64N 时间戳的日志。

为此,添加:

着色问题

遗憾的是,其中一些工具的着色效果非常错误。他们硬连线控制序列,而不是使用terminfo 中的setaf/setab等。

另请注意,由于更微妙的原因,着色很棘手,并且几乎没有着色程序能够正确处理。为了完全正确,着色器必须处理自动边距和 DEC VT待处理换行机制,我还没有看到任何着色器这样做。 GNUgrep在这个领域有一个相当著名的着色错误,但这不仅仅是一个问题grep

进一步阅读

答案3

勾选后,可以直接在终端中使用 输出彩色文本awk。通过您提供的示例,您可以创建一个displayLog.awk包含以下代码的 awk 脚本文件(例如 ):

# output INFO lines in cyan
$3 == "INFO" {
    print "\033[36m"$0"\033[0m"
    next
}

# don't display DBG lines
$3 == "DBG" {
    next
}

# output WARNING lines in bright yellow
$3 == "WARNING" {
    print "\033[1;33m"$0"\033[0m"
    next
}

# output ERROR lines in bright red
$3 == "ERROR" {
    print "\033[1;31m"$0"\033[0m"
    next
}

# If you want to skip all other lines, comment next line
{print}

然后打开一个干净的终端窗口,检查显示是否不受限制(您可以一次显示所有 6000 行)并按如下方式使用:

$ awk -f displayLog.awk log.txt

或者点赞用户伊利亚格雷在他的解决方案中建议,将其传输到原始模式less

$ awk -f displayLog.awk log.txt | less -R

这应该够了吧 !您可以根据我的答案中的示例代码来调整颜色以及要显示的行awk。有关颜色编码的更多信息这里

编辑

如果您只想对一个单词而不是一整行进行着色(例如您希望 ERROR 仅显示为红色),请执行以下操作:

$3 == "ERROR" {
    $3 = "\033[1;31m"$3"\033[0m"
    print
    next
}

答案4

如果您想根据模式(即错误、警告、信息...)突出显示日志的某些行,请使用以下命令:

grep -rn "pattern" <logfile>

此命令将显示日志文件的所有完整行,其模式如上所述。

相关内容