核心是提取关键字段→汇总统计→可视化绘图:用awk按小时/分钟提取时间戳并统计频次,Python结合pandas与matplotlib绘制趋势图,并可扩展分析状态码、IP、路径等异常模式,支持定时自动化。

用统计脚本分析 Apache 日志生成趋势图,核心是:提取关键字段 → 汇总统计 → 可视化绘图。不需要手动翻日志,一条命令链或一个轻量脚本就能搞定。
提取并按时间聚合访问次数
Apache 默认日志(如 /var/log/apache2/access.log)每行含时间戳(格式如 [10/Jan/2024:14:22:03 +0800])。可用 awk 提取小时级或分钟级时间粒度,再用 sort | uniq -c 统计频次:
- 按小时统计(适合看全天波动):
awk '{gsub(/\[/,"",$4); print substr($4,1,13)}' /var/log/apache2/access.log | sort | uniq -c | awk '{print $2" "$1}' > hourly_count.txt - 按分钟统计(适合排查突发流量):
awk '{gsub(/\[/,"",$4); print substr($4,1,16)}' access.log | sort | uniq -c | awk '{print $2" "$1}' > minute_count.txt
用 Python 快速画出趋势折线图
保存好统计结果(如 hourly_count.txt 格式为 2024-01-10:14 287),用几行 Python 就能出图:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 安装依赖:pip install matplotlib pandas
- 运行脚本(可直接复制保存为 plot_trend.py):
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('hourly_count.txt', sep=' ', header=None, names=['time', 'count'])
df['time'] = pd.to_datetime(df['time'], format='%Y-%m-%d:%H')
df.set_index('time').plot(y='count', kind='line', figsize=(10,5))
plt.title('Hourly Apache Access Trend'); plt.grid(True)
plt.savefig('trend_hourly.png'); plt.show()
识别异常请求模式(不止看总量)
单纯看访问数可能掩盖问题。建议额外统计几类关键指标:
- 状态码分布:比如 awk '$9 ~ /^5../ {print $9}' access.log | sort | uniq -c 查 5xx 错误突增时段
- 高频 IP 排名:用 awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10 快速定位疑似爬虫或攻击源
- 热门路径变化:对比两天的 awk '$7 {print $7}' access.log | sort | uniq -c | sort -nr | head -5,看是否有新接口被集中调用
自动化与定期监控(小技巧)
把分析变成日常习惯,只需加个定时任务:
- 写一个完整脚本(如 analyze_apache.sh),包含日志切割、统计、绘图、邮件发送 PNG 图片
- 用 crontab -e 添加:
# 每天凌晨2点分析昨日日志
0 2 * * * /path/to/analyze_apache.sh /var/log/apache2/access.log.1 - 注意:生产环境建议先用 zcat 处理压缩日志(access.log.1.gz),避免磁盘占满
不复杂但容易忽略:确保日志时间与时区一致(特别是用了 logrotate 的机器),否则按小时聚合会错位。绘图前用 head -5 hourly_count.txt 看一眼时间格式是否解析正确,能省下大半调试时间。

















