如何在Linux下优雅的查询日志

如何在Linux下优雅的查询日志

做为一名合格的Java后台开发
经常需要查询线上的日志,定位线上问题
所以熟练掌握日志查询的命令
可以使你更加迅速的定位错误日志位置,及时解决问题
在此,我将介绍几个自己工作中经常使用到的日志查询命令
大家一起学习讨论,让我们都能更优雅的操作日志

假设你有一个日志文件demo.log,里面的内容如下所示,
我们将使用这个文件,来演示如何优雅的查询日志文件、定位文件内容。

1
2
3
4
5
6
7
8
9
10
line1 123456 aa
line2 123456 bb
line3 123456 cc
line4 123456 dd
line5 654321 aa
line6 654321 bb
line7 12
line8 34
line9 56
line0 78

用于输出文件中的尾部内容,实际应用如下:

1
2
3
4
5
6
7
8
9
// 显示文件倒数2行数据,并实时刷新新日志
tail -2f demo.log

// 执行效果如下:
line9 56
line0 78

// 如果你需要停止,按Ctrl+C退出
// 假如查看的日志,实时刷新的日志量非常多的话,慎用!

命令用于连接文件并打印到标准输出设备上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 显示文件全部内容
cat demo.log

// 执行结果:
line1 123456 aa
line2 123456 bb
line3 123456 cc
line4 123456 dd
line5 654321 aa
line6 654321 bb
line7 12
line8 34
line9 56
line0 78

// 由于会显示整个文件的内容,所以如果文件大的话,慎用!

类似cat,不过会以一页一页的形式显示,按空白键space就往下一页显示,按b键就会往回一页显示

1
2
3
4
5
6
7
more demo.log

// 执行结果(文件内容少的话,会直接显示全部,效果跟cat一样):
line1 123456 aa
line2 123456 bb
line3 123456 cc
--More--(15%)

lessmore类似,但使用less可以随意浏览文件(使用键盘上的上下箭头),而且less在查看之前不会加载整个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
less demo.log

// 执行结果(文件内容少的话,会直接显示全部,效果如下):
line1 123456 aa
line2 123456 bb
line3 123456 cc
line4 123456 dd
line5 654321 aa
line6 654321 bb
line7 12
line8 34
line9 56
line0 78
demo.log (END)

grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,grep指令会把含有范本样式的那一列显示出来

1
2
3
4
5
6
7
8
// 查询包含关键字`123456`的日志内容
grep "123456" demo.log

// 执行结果
line1 123456 aa
line2 123456 bb
line3 123456 cc
line4 123456 dd
1
2
3
4
5
// 查询包含关键字`123456`且包含`aa`的日志内容
grep "123456" demo.log | grep "aa"

// 执行结果
line1 123456 aa
1
2
3
4
5
6
7
8
9
10
11
12
// 查询不包含`aa`的日志内容
grep -v "aa" demo.log

// 执行结果
line2 123456 bb
line3 123456 cc
line4 123456 dd
line6 654321 bb
line7 12
line8 34
line9 56
line0 78
1
2
3
4
5
6
7
// 查询包含关键字`123456`但不包含`aa`的日志内容
grep "123456" demo.log | grep -v "aa"

// 执行结果
line2 123456 bb
line3 123456 cc
line4 123456 dd
1
2
3
4
5
6
7
8
9
10
11
// 查询包含关键字`123456`或`aa`的日志内容
grep "123456\|aa" demo.log
或者
grep -E "123456|aa" demo.log

// 执行结果
line1 123456 aa
line2 123456 bb
line3 123456 cc
line4 123456 dd
line5 654321 aa
  • 总结

当你通过grep查找关键字,但是还是有非常多匹配的结果时,可以组合前面的lessmore实现分页显示,示例如下:

1
2
3
4
5
grep "123456" demo.log | less
grep "123456" demo.log | more

grep "123456\|aa" demo.log | less
grep "123456" demo.log | grep -v "aa" | less

通过以上介绍的几个命令,相信应该足够应付大部分的查找日志的场景。

好了,剩下的就是勤加练习了。

当然,如果你有更好的方式可以更加优雅的查询日志,也希望你能与我一起分享


  • 2018-09-05补充:

当使用less命令查看日志时,还可以对关键字进行查找。命令如下:

1
2
3
4
5
6
7
// 使用斜杠(/)加关键字的形式,向后查找关键字,如查找关键字:123456
/123456

// 使用问号(?)加关键字的形式,向前查找关键字,如查找关键字:line3
?line3

// PS:跳转到后一个关键字快捷键: N; 跳转到前一个关键字:shift + N

关于cat命令,还有一个与之类似但写法相反的命令:tac。写法就是cat反过来写

功能也是相反的,是从后往前显示内容。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
tac demo.log

// 执行结果:
line0 78
line9 56
line8 34
line7 12
line6 654321 bb
line5 654321 aa
line4 123456 dd
line3 123456 cc
line2 123456 bb
line1 123456 aa
作者

Trainoo

发布于

2018-06-23

更新于

2020-06-02

许可协议