cron 定时统计 apache 日志访问排名的核心是自动执行分析脚本、定期触发和结果可读,无需修改 apache 配置或依赖 mod_cron,仅需系统级 cron 配合 python 或 awk 脚本即可稳定运行。

用 Cron 定时统计 Apache 日志访问排名,核心是“自动执行分析脚本 + 定期触发 + 结果可读”。不需要改 Apache 配置,也不依赖 mod_cron,直接用系统级 cron 配合简单脚本就能稳定运行。
准备一个轻量级统计脚本
脚本目标:提取 access_log 中的 IP、User-Agent(如 Firefox/MSIE)、状态码等关键字段,按访问次数排序输出前 10 名。推荐用 Python(易读)或 awk(无需额外依赖)。
- Python 示例(保存为 /usr/local/bin/top_ips.py):
#!/usr/bin/env python3
import re
from collections import Counter
log_file = "/var/log/httpd/access_log"
c = Counter()
with open(log_file) as f:
for line in f:
m = re.match(r'^(\d+\.\d+\.\d+\.\d+)', line)
if m:
c[m.group(1)] += 1
for ip, cnt in c.most_common(10):
print(f"{cnt:6d} {ip}")
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 赋予执行权限:sudo chmod +x /usr/local/bin/top_ips.py
- 手动测试是否能跑通:sudo /usr/local/bin/top_ips.py,确认输出类似:
2487 192.168.1.101
1832 203.208.60.123
用 crontab 设置定时任务
让脚本每天凌晨 2 点自动运行,并把结果写入固定文件,方便查看或后续处理。
- 编辑当前用户(通常是 root)的定时任务:sudo crontab -e
- 添加这一行(每天 2:00 执行,结果追加到 /var/log/apache_top10.log):
0 2 * * * /usr/local/bin/top_ips.py >> /var/log/apache_top10.log 2>&1 - 注意:必须用绝对路径(如 /usr/bin/python3 或 /usr/local/bin/top_ips.py),避免 cron 环境变量缺失导致失败
- 如果想保留每日独立记录,可改用日期命名:
0 2 * * * /usr/local/bin/top_ips.py > /var/log/apache_top10_$(date +\%Y\%m\%d).log 2>&1
增强实用性的小技巧
让统计不止于“跑一次”,而是真正可用、可追溯、防堆积。
-
自动清理旧结果:在 cron 行里串联命令,比如只保留最近 30 天的日志:
0 2 * * * /usr/local/bin/top_ips.py > /var/log/apache_top10_$(date +\%Y\%m\%d).log 2>&1 && find /var/log -name "apache_top10_*.log" -mtime +30 -delete - 带时间戳输出:在脚本开头加 print("#", datetime.now().strftime("%Y-%m-%d %H:%M")),便于定位统计时段
- 区分 HTTP 状态:修改正则匹配时带上 "\s(200|404|500)\s",就能单独统计失败请求 Top IP
- 发邮件通知(可选):用 mail -s "Apache Top10 Report" admin@example.com 替代重定向
验证与排错要点
刚配置完别急着走,花两分钟确认它真正在工作。
- 检查 cron 是否运行:sudo systemctl status crond(CentOS/RHEL)或 sudo systemctl status cron(Ubuntu/Debian)
- 查看 cron 日志(默认在 /var/log/cron):sudo tail -f /var/log/cron,找是否有执行记录或 permission denied 错误
- 模拟 cron 环境测试脚本:env -i PATH=/usr/bin:/bin /usr/local/bin/top_ips.py,排除环境变量干扰
- 确保 Apache 日志路径正确且可读:sudo -u apache cat /var/log/httpd/access_log | head -1(用 Apache 进程用户身份测试)










