我想更改使用 wim、less 或其他方式显示大(约 6000 行)日志文件的方式,以简化问题检查。
我想根据模式突出显示日志的某些行(即,,error
... )和/或隐藏其他一些行。warning
info
我可以使用哪些工具?我只需要一个 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>
此命令将显示日志文件的所有完整行,其模式如上所述。