服务器出了问题,答案往往就藏在日志里——谁在攻击、为什么报错、流量从哪来。但很多人面对日志文件无从下手。本文教你日志在哪、怎么看、怎么用几条命令从海量日志里快速提取有用信息。
一、关键日志都在哪?
- Nginx访问日志:
/var/log/nginx/access.log——谁访问了什么; - Nginx错误日志:
/var/log/nginx/error.log——502/504等故障的原因都在这; - 系统日志:
/var/log/syslog(Debian/Ubuntu)或journalctl(systemd)——系统级事件; - SSH登录日志:
/var/log/auth.log——登录成功/失败记录,查爆破必看; - 应用日志:各应用自己的日志目录。
二、基础查看命令
tail -f access.log # 实时滚动查看(排故障时最常用)
tail -n 100 access.log # 看最后100行
grep "404" access.log # 筛选包含404的行
less access.log # 分页浏览,可搜索
tail -f 是排故障神器——一边操作一边实时看日志输出,问题一目了然。
三、用awk/grep做统计分析(精华)
Nginx访问日志里藏着大量有价值的信息,几条命令就能挖出来:
# 统计访问量最高的IP前10(揪出高频抓取/攻击)
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 统计被访问最多的URL前10(看热门页面/被刷的接口)
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10
# 统计各HTTP状态码数量(看404/500多不多)
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 统计访问最多的User-Agent(识别爬虫)
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head
这几条命令能快速回答:谁在疯狂请求?哪个页面最火或被刷?有没有大量报错?是不是有恶意爬虫?
四、查安全事件
# 查SSH登录失败(爆破尝试)
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn
# 查成功登录记录(确认有没有陌生IP登入)
grep "Accepted" /var/log/auth.log
如果发现某IP有成千上万次登录失败,那是爆破;如果成功登录里有你不认识的IP,警报——立即排查是否被入侵(参考博客的入侵应急教程)。
五、日志管理:别让日志拖垮服务器
日志会持续增长,不管理会吃满磁盘(参考博客”磁盘满了怎么办”)。用logrotate自动轮转:
- 按大小或时间切割日志;
- 压缩旧日志;
- 只保留N天,自动删除更早的。
大多数发行版的Nginx已自带logrotate配置,检查并按需调整保留策略即可。
六、进阶:可视化日志分析
流量大、要长期分析趋势时,命令行不够用了,可上专业方案:GoAccess(轻量,一条命令生成HTML可视化报告)、或ELK/Loki等日志平台(重型,适合多机集中分析)。对多数中小站点,GoAccess已经很够用:goaccess access.log -o report.html 就能生成漂亮的访问分析报告。
日志是服务器的”黑匣子”,学会读它,排故障、抓攻击、懂流量都事半功倍。下次遇到问题,先别慌着重启——tail -f error.log 看一眼,答案可能就在那里。在你的服务器上把本文的统计命令跑一遍,你会惊讶于日志里藏了多少信息。