日志查询技巧

很多新手习惯用 cat,但对于大文件,cat 会导致屏幕刷屏,还容易把终端卡死。

tail 实时监控

1
2
# -f (follow):实时追加显示文件尾部内容
tail -f logs/application.log
1
2
# 只看最后 200 行,并保持实时刷新,避免被历史日志干扰
tail -n 200 -f logs/application.log

less 按需加载

如果需要查看之前的日志,推荐使用 less。不同于 vim 会一次性加载整个文件占用大量内存,less 是按需加载,打开几个 G 的文件也极其流畅,且支持向后回溯

1
less logs/application.log

Shift + G 先跳到日志最末尾。
?12345678 输入问号+搜素的内容,向上反向搜索。
n:如果当前这行不是关键信息,按 n 继续向上找上一次出现的位置。
Shift + F 如果看着看着,日志又更新了,按这个组合键可以让 less 进入类似 tail -f 的实时滚动模式;按 Ctrl + C 退回浏览模式

grep 关键词搜索

1
2
3
4
5
6
# 搜索异常关键字,并显示该行 "前后各 20 行"
grep -C 20 "NullPointerException" logs/application.log
# -c (count):只统计匹配的行数
grep -c "RedisConnectionException" logs/application.log
# -v (invert):显示不包含 "HealthCheck" 的所有行
grep -v "HealthCheck" logs/application.log

sed 日志切片

有时候日志非常大,例如有 10GB,grep 搜出来的内容依然过多。如果我们明确知道生产事故发生在 14:00 到 14:05 之间,该怎么办?
下载整个日志不现实,sed 可以帮我们把这段时间的日志单独切出来,保存成一个小文件慢慢分析。
真实场景:导出事故时间窗口的日志

1
2
3
# 语法:sed -n '/开始时间/,/结束时间/p' 源文件 > 目标文件
# 注意:时间格式必须和日志里的格式完全一致
sed -n '/2025-12-19 14:00/,/2025-12-19 14:05/p' logs/application.log > error_segment.log

这样你就得到了一个只有几 MB 的 error_segment.log

awk 数据简报

awk 擅长处理列数据,对于格式规范的日志,如 Nginx 访问日志、Apache 日志,它可以直接在服务器上生成简报。
真实场景 A:遭到攻击,查找恶意 IP
服务突然报警 CPU 飙升,怀疑遭到 CC 攻击或爬虫抓取,我们需要分析 Nginx 日志,找出访问量最高的 IP。
假设日志格式第一列是 IP:

1
2
3
4
5
6
# 1. awk '{print $1}':提取第一列(IP)
# 2. sort:排序,把相同的 IP 排在一起
# 3. uniq -c:去重并统计每个 IP 出现的次数
# 4. sort -nr:按次数(n)倒序(r)排列
# 5. head -n 10:取前 10 名
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

真实场景 B:找出响应最慢的接口

1
2
3
4
Nginx 日志中通常记录了响应时间,假设在最后一列,我们想把响应时间超过 1 秒的请求找出来。
# $NF 代表最后一列
# 打印所有响应时间大于 1 秒的 URL(假设 URL 在第 7 列)
awk '$NF > 1.000 {print $7, $NF}' access.log

严格来说,Linux 命令最权威的文档是 Man Pages (手册页)GNU 官方文档

你需要的功能(按需加载、搜索、切片)其实是这些工具的核心用法。为了节省你去翻阅晦涩的英文手册的时间,我整理了官方文档链接以及针对你描述场景的速查实战代码

官方文档直达链接

命令 描述 官方文档/手册链接
tail 输出文件尾部 / 实时监听 GNU Coreutils: tail invocation
less 分页查看 / 按需加载大文件 Man7.org: less(1)
grep 文本搜索 / 关键词匹配 GNU Grep Manual
sed 流编辑器 / 日志切片 GNU Sed Manual

参考大佬文章