linux日志分析核心是“有目标地找证据”,分三步:定位关键日志文件、用命令组合快速筛选、提取时间/来源/上下文等有效线索,并辅以统计与模式识别提升效率。

Linux日志分析不是翻文件,而是“有目标地找证据”。核心就三步:知道日志在哪、用对工具看、按需提取关键信息。下面直接说实用操作,不绕弯。
一、先定位关键日志文件
不同问题查不同日志,别全扫/var/log——效率低还容易漏重点:
- /var/log/messages(centos/RHEL)或 /var/log/syslog(ubuntu/debian):系统级事件主入口,服务启停、内核警告、硬件异常都优先看它;
- /var/log/secure(CentOS)或 /var/log/auth.log(Ubuntu):所有登录行为、sudo、su、ssh成败记录全在这里,安全排查必查;
- /var/log/kern.log 或 dmesg:怀疑驱动、磁盘、网卡、内存故障时,直接看内核层反馈;
- /var/log/nginx/access.log 和 Error.log(或 apache 对应路径):Web服务问题,先分清是访问失败(4xx/5xx)还是进程崩溃(段错误、超时);
- journalctl -u 服务名(如
journalctl -u sshd):systemd 系统下,比查文本日志更准、更实时,尤其适合刚重启过的服务。
二、快速筛选有效信息的命令组合
不用从头读,用命令直击要害:
- 查最近10分钟的错误:
journalctl --since "10 minutes ago" | grep -i "error|fail|denied"; - 看某IP反复尝试登录:
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | head -5($11 是源IP,在标准格式下); - 确认某个服务是否真在报错:
journalctl -u nginx --no-pager -n 50 | grep -E "(error|crit|alert)"(-n 50 只看最近50行,–no-pager 避免卡在 less); - 查启动失败原因:
journalctl -b -p err(-b 表示本次启动,-p err 只显示 error 及以上级别); - 实时盯住新错误:
tail -f /var/log/messages | grep --line-buffered -i "oom|kill|panic"(–line-buffered 保证实时输出,不缓存)。
三、从日志里提取真正有用的线索
光看到“Failed”没用,得看出时间、来源、频率、上下文:
- 同一IP多次失败?用
grep "Failed password" /var/log/secure | awk '{print $1,$2,$3,$9,$11}' | head -10查时间+用户名+IP; - 错误前后有没有关联动作?用
grep -C 3 "Connection refused" /var/log/messages看前后3行,常能发现端口被占、依赖服务未启; - 时间不统一?注意日志里的时间是本地时区,而
journalctl默认用系统时区,排查跨时区集群问题时加--utc; - 日志轮转后找不到旧记录?别只查
/var/log/secure,试试zgrep "Failed" /var/log/secure.1.gz或journalctl --since "2025-12-10"回溯归档。
四、进阶:简单统计与模式识别
日常运维中,重复性问题靠人工数太慢,几行命令就能出结论:
- 统计各http状态码分布:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr; - 看哪个用户最常提sudo:
grep "sudo:" /var/log/auth.log | awk '{print $10}' | sort | uniq -c | sort -nr($10 通常是用户名); - 检查磁盘IO异常时间点:
grep "buffer I/O error" /var/log/messages | awk '{print $1,$2,$3}' | head -3,再结合dmesg -T | tail -20确认硬件层是否同步报错。
基本上就这些。日志分析能力不靠背命令,而在于建立“问题→日志类型→关键词→上下文→验证”的条件反射。练熟三五次,定位80%的常见问题都能在两分钟内开口说出根因。