一、实时跟踪日志(排障首选)
1. tail(线上最常用)
# 实时跟踪,日志轮转后失效
tail -f app.log
# 生产首选:日志切割(logrotate)后依然持续监听
tail -F app.log
# 先加载最后500行,再实时跟踪(防止日志刷屏)
tail -n 500 -F app.log
# 同时监控多个日志文件
tail -F app.log error.log
2. less 实时跟踪(可随时暂停、搜索)
less +F app.log
# 按Ctrl+C退出实时模式;输入/关键词向下搜索;?关键词向上回溯
二、grep 关键字检索(90% 异常排查必用)
基础参数
-i:忽略大小写-A10:匹配行后 10 行(抓异常堆栈)-B10:匹配行前 10 行-C15:前后各 15 行(抓取完整 Java 异常栈)-v:排除指定内容(过滤心跳、健康检查)--color=always:关键词高亮
高频实战命令
# 抓取ERROR+前后15行堆栈
grep -C15 --color=always "ERROR" app.log
# 忽略大小写查找超时异常,排除健康检测日志
grep -i "timeout" app.log | grep -v "healthCheck"
# 多关键词匹配(NPE 或者 连接失败)
grep -E "NullPointerException|Connection refused" app.log
# 递归在整个日志目录搜索关键字
grep -r "traceId=xxx" /data/logs/
# 只输出匹配行数,统计报错频次
grep "ERROR" app.log | wc -l
三、时间段精准截取日志(核心!锁定故障窗口)
1. sed 按时间切片(最稳)
# 提取 2026-10-27 14:00 ~ 14:10 的日志
sed -n '/2026-10-27 14:00:00/,/2026-10-27 14:10:00/p' app.log > temp.log
2. 配合 grep,只看时间段内的报错
sed -n '/2026-10-27 14:00/,/2026-10-27 14:10/p' app.log | grep -i error
四、查看历史归档压缩日志(不用解压直接查)
线上日志会自动压缩为 .gz,用 z 系列命令:
# 直接检索压缩包,无需解压(替代grep)
zgrep -C10 "Exception" app-2026-10-26.log.gz
# 分页查看压缩日志(替代less)
zless app-2026-10-26.log.gz
# 查看压缩日志开头/结尾
zcat xxx.gz | head -n 200
zcat xxx.gz | tail -n 300
五、less 打开超大日志(GB 级文件首选,不占内存)
操作快捷键(必记)
Shift+G:跳到日志末尾(最新日志)/关键词:向下正向搜索?关键词:向上反向搜索(查最新报错首选)n:下一条匹配;N:上一条匹配空格:向下翻页;b:向上翻页
q:退出
# 打开大日志
less app.log
六、systemd 服务日志(journalctl,排查进程崩溃)
# 实时跟踪指定服务日志
journalctl -f -u myapp.service
# 只看错误级别日志(err及以上)
journalctl -f -u myapp.service -p err
# 按时间查询:近30分钟日志
journalctl -u myapp.service --since "30 minutes ago"
# 查看本次开机以来的服务日志
journalctl -b -u myapp.service
七、内核日志(dmesg,排查 OOM、硬件、磁盘、网络异常)
# 带时间戳查看内核日志
dmesg -T | less
# 只筛选内核错误(OOM killed进程必查这里)
dmesg -T -l err,crit
# 快速查找进程被OOM杀死记录
dmesg -T | grep -i "killed process"
八、结构化日志分析(awk,统计接口、耗时、访问量)
1. Nginx / 接口访问日志统计
# 统计所有接口访问次数,降序排列
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -20
# 找出响应时间超过3秒的请求
awk '($NF > 3) {print $7,$NF}' access.log
2. JSON 日志提取字段(Java / 容器 JSON 日志)
# 提取traceId和报错信息(安装jq:yum install jq)
cat app.json.log | jq '.traceId,.message'
# 只过滤ERROR级别日志
cat app.json.log | jq 'select(.level=="ERROR")'
九、容器 / K8s 日志专用命令
# 查看容器实时日志
docker logs -f container_id
# K8s Pod实时日志,查看最近200行
kubectl logs -f --tail=200 pod-name
# 查看Pod之前崩溃的历史日志
kubectl logs -p pod-name
十、线上组合命令(直接复制,覆盖 80% 故障场景)
场景 1:实时盯报错,过滤噪音
tail -F app.log | grep --color=always -i "error\|exception" | grep -v "heartbeat\|DEBUG"
场景 2:查询某个 traceId 全链路日志(跨文件检索)
grep -r "traceId=T123456" /data/logs/ --include="*.log" --include="*.gz"
场景 3:导出某 10 分钟内所有异常,落地到临时文件
sed -n '/2026-10-27 14:00/,/2026-10-27 14:10/p' app.log | grep -i error > error-14点.log
场景 4:统计 1 小时内每种异常出现次数,找出高频报错
sed -n '/2026-10-27 14:00/,/2026-10-27 15:00/p' app.log \
| grep -E "Exception|ERROR" \
| awk '{print $5}' \
| sort | uniq -c | sort -nr
十一、避坑提醒(线上不要这么干)
❌ 不要
cat app.log打开 GB 级大文件,直接卡死服务器;用less❌ 不要直接
grep整个超大文件不加时间范围,IO 打满✅ 优先用
tail -F+ 管道过滤,减少日志输出量✅ 查历史日志优先用
zgrep,不解压,效率更高