日志文件是 Linux 系统运行状况和管理事件的“黑匣子”,无论是 web 服务器的访问日志、系统认证日志,还是应用自己输出的调试信息,最终都表现为不断追加的文本文件。结合“小工具组合”的哲学,Linux 提供了一套极为高效的手段,让你无需复杂的商业软件就能完成大量实时的日志分析和统计任务。
1. 从哪里看日志
- 传统系统日志多集中在
/var/log/目录下,比如/var/log/syslog(系统通用)、/var/log/auth.log(认证相关,su、sudo 等)、/var/log/kern.log(内核)。 - 使用 systemd 的发行版可以用
journalctl统一查询,如journalctl -u ssh.service查看 SSH 服务日志。 - Web 服务器(Nginx、Apache)和应用通常有自己的日志目录,在
/var/log/nginx/access.log等位置。
2. 基础查看与过滤
不要试图用编辑器打开几个 GB 的日志文件,而是用命令行组合即时筛选:
tail -f /var/log/auth.log | grep "Failed password"
这条命令会实时跟踪认证日志,只显示包含“Failed password”的新行,适合监控暴力破解尝试。
grep "error" /var/log/app.log | tail -20
从应用日志中快速提取最后 20 条错误记录。
3. 提取关键字段
以 Nginx 的典型组合日志格式为例:
192.168.1.10 - - [01/Jan/2025:12:00:00 +0000] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0"
快速提取访问最多的 IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
awk '{print $1}'提取每行第一个字段(IP 地址)sort让相同的 IP 连续排列uniq -c统计每个 IP 出现的次数sort -rn按次数逆序排列head默认显示前 10
同理,统计 HTTP 状态码分布:
awk '{print $9}' access.log | sort | uniq -c | sort -rn
4. 时间窗口过滤
当需要分析某个时间段内的日志时,可以用 awk 直接进行时间比较,或者使用更方便的工具 sed 结合正则表达式。例如提取 2025 年 4 月 1 日 8 点到 9 点的行:
grep "01/Apr/2025:0[89]:" access.log
或者用 awk 条件判断:
awk -F'[ :]' '$4=="01/Apr/2025" && $5>="08:00:00" && $5<="09:00:00"' access.log
5. 快速统计和监控
- 统计当前服务器上记录的最新 1000 个请求的平均响应时间(假设日志第 10 字段是响应时长):
tail -1000 access.log | awk '{sum+=$10} END {print sum/NR}'
- 实时监控每分钟的请求速率:
tail -f access.log | pv -l -i 60 > /dev/null
pv 命令会报告通过管道的行速率,-i 60 以 60 秒为间隔。
6. 持久化脚本与定时任务
把实用的命令行封装成脚本,交给 cron 定时执行,就能将日志分析自动化。例如,每天凌晨生成昨天访问量前 10 的 URL 报告并发送邮件:
#!/bin/bash
LOG="/var/log/nginx/access.log.1" # logrotate 通常把昨天的日志重命名
echo "Yesterday's top 10 URLs:" > /tmp/top_urls.txt
awk '{print $7}' "$LOG" | sort | uniq -c | sort -rn | head >> /tmp/top_urls.txt
mail -s "Daily URL report" admin@example.com < /tmp/top_urls.txt
配合 crontab -e 添加:
0 7 * * * /path/to/report.sh
7. 常见陷阱与建议
- 日志轮转:长期分析的脚本应考虑到日志文件会被轮转压缩(
access.log.1.gz),可以使用zcat或zgrep直接处理压缩包。 - 性能考虑:避免在线上繁忙时对巨大日志文件执行不加限制的
cat或grep,尽量使用tail限定行数,或先grep过滤再传入管道。 - 安全:日志中可能含有敏感信息(如 token、密码明文),分析脚本应限制读取权限,避免误传到不安全的通道。
通过这种“小命令 + 管道”的组合方式,你不需要专门的日志分析平台即可完成绝大多数实时诊断和统计任务,这正是 Linux 工具哲学在生产环境中最直接、最有价值的体现。