
Linux 日志分析的关键不是看全量内容,而是用对工具、抓准线索、聚焦时间窗口和关键字段。定位问题往往只需要几条命令组合,配合日志上下文就能快速缩小范围。
盯住核心日志路径和实时滚动
大多数服务日志集中在 /var/log/ 下,常见重点包括:
- /var/log/syslog(Debian/Ubuntu 系统级事件)
- /var/log/messages(RHEL/CentOS 系统日志)
- /var/log/auth.log(登录、sudo、SSH 认证行为)
- /var/log/kern.log(内核消息,排查硬件、驱动、OOM)
- 服务专属日志如 /var/log/nginx/error.log、/var/log/mysql/error.log
排查进行中问题时,优先用 tail -f 实时观察:
tail -f /var/log/syslog | grep -i "error\|fail\|denied"
加 -n 100 先看最近百行再追加实时流,避免一上来就被刷屏干扰。
按时间精准过滤(尤其跨天/重启后)
很多问题发生在特定时间段,但默认日志不带纳秒,且系统重启后时间可能跳变。稳妥做法是结合 journalctl(systemd 系统):
# 查最近1小时的 ssh 登录失败 journalctl -u ssh --since "1 hour ago" | grep "Failed password" <h1>定位某次重启后的全部报错</h1><p>journalctl -b -p err</p><h1>按具体时间范围(支持自然语言)</h1><p>journalctl --since "2024-05-20 14:30:00" --until "2024-05-20 14:35:00"
非 systemd 系统可用 awk 匹配时间字段(注意日志格式差异):
awk '/May 20 14:3[0-5]:/ {print}' /var/log/messages用关键词+上下文联动定位根因
单查 “error” 往往噪声大。更有效的是:先找异常现象关键词(如 connection refused、timeout、segmentation fault),再用 -A/-B/-C 查上下文:
# 查出错行 + 前后3行,看清调用链或配置上下文 grep -A 3 -B 3 "Connection refused" /var/log/nginx/error.log <h1>结合进程ID(PID)追踪同一请求完整日志</h1><p>grep -A 5 -B 5 "pid[12345]" /var/log/php-fpm.log
对高频重复日志,用 sort | uniq -c | sort -nr 快速识别 Top 异常模式:
awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -10善用结构化工具降低认知负担
纯文本 grep 效率低时,可借助轻量工具提升信息密度:
-
lnav:自动识别日志格式,支持 SQL 查询、高亮、折叠、时间轴导航(
apt install lnav) - ccze:为 grep 输出加颜色,一眼区分 level(ERR/WARN/INFO)
- multitail:并列监控多个日志文件,支持合并视图与正则高亮
例如用 lnav 打开 Nginx 错误日志后,直接输入:
:filter-out /success/ —— 屏蔽成功请求
:filter /50[0-3]/ —— 只留 500~503 错误










