Linux 日志排查的五个实用技巧
在日常运维和故障排查中,Linux 系统的日志是定位问题的第一现场。无论是服务启动失败、磁盘空间告警,还是异常登录,日志里往往藏着答案。但面对动辄数十 MB 甚至 GB 的日志文件,盲目 cat 只会让排查效率更低。下面分享五个在实战中高频使用的日志排查技巧,配合真实命令示例,帮助快速锁定问题。
一、用 tail -f 实时跟踪日志输出
当服务行为正在发生时,实时观察日志是最直接的方式。tail 的 -f 参数会持续输出文件新增内容,配合 -n 可以只关注最近几行。
tail -f /var/log/syslog
tail -n 50 -f /var/log/nginx/access.log
如果日志文件会被定期切割(例如 logrotate 后原文件变为 .1),用 tail -F 可自动重新打开新文件,避免跟踪中断。
二、用 grep 快速过滤关键词
grep 是日志排查的瑞士军刀。结合 -i 忽略大小写、-C 输出匹配行上下文,可以快速定位相关记录。
# 找出所有 ERROR 行及其前后两行
grep -i -C 2 "error" /var/log/app/service.log
# 同时匹配多个关键词(正则交替)
grep -E "timeout|refused|failed" /var/log/messages
对于大文件,建议先 grep 再管道到 less 浏览,避免终端被大量输出淹没:
grep -i "connection refused" /var/log/app/service.log | less
三、用 journalctl 结构化查询 systemd 日志
systemd 管理的系统使用 journalctl 取代了传统的 /var/log/messages。journalctl 支持按单元、时间、优先级筛选,非常适合定位服务异常。
# 只看 nginx 最近的 100 条日志
journalctl -u nginx -n 100 --no-pager
# 查看今天以来的错误级别以上日志
journalctl -p err -since "today"
# 查看某服务上次启动到本次启动之间的日志
journalctl -u myservice --since "reboot"
配合 -f 同样可以实时跟踪:journalctl -u nginx -f。
四、用 awk 和 cut 做简单的日志统计
当需要看"哪个 IP 请求最多"或"哪些状态码占大头"时,awk 比写脚本更快。
# Apache/Nginx Combined 格式中,统计 Top 10 访问 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 统计 HTTP 状态码分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 只看响应时间大于 2 秒的请求(假设最后一列为耗时)
awk '$NF > 2 {print}' /var/log/nginx/access.log
五、用 logrotate 和磁盘检查避免"日志把磁盘写满"
日志排查本身也可能被日志反噬:/var/log 占满磁盘会导致新日志写不进去,服务直接崩溃。排查时先检查磁盘,再找日志。
# 查看各分区使用率
df -h
# 找出 /var/log 下最大的 10 个文件
du -ah /var/log | sort -rh | head -10
确认是日志占满后,先检查 logrotate 配置 /etc/logrotate.conf 及 /etc/logrotate.d/ 下的规则,确保日志会定期切割和压缩。紧急清理不要直接 rm 日志文件(进程仍持句柄,空间不释放),正确做法是清空文件内容:
> /var/log/app/service.log
# 或
truncate -s 0 /var/log/app/service.log
之后 systemctl reload 相关服务或执行 logrotate -f /etc/logrotate.conf 触发切割。
小结
这五个技巧覆盖了"看日志 → 筛日志 → 统计日志 → 防日志爆炸"的常用链路。实际排查时通常组合使用,例如先用 journalctl 找到异常时间点,再切到具体应用日志用 grep -C 拉上下文,最后用 awk 统计确认是否为批量问题。把日志当数据来查,而不是当文本来翻,效率会高很多。
- 点赞
- 收藏
- 关注作者
评论(0)