Apache日志通过解析并归一化请求路径(如去除参数、统一斜杠),按预设规则映射到业务模块(如正则匹配/user/→user),再聚合统计PV,需过滤健康检查、静态资源及爬虫流量,聚焦200/302有效请求。

Apache 日志中记录了每次 HTTP 请求的路径(如 /user/login、/order/create),通过解析这些请求路径,可以统计出哪些业务模块(如用户模块、订单模块)被访问最多,从而识别热门业务。关键在于将原始 URL 路径映射到逻辑业务模块,并聚合统计。
提取并归一化请求路径
Apache 的 access.log 通常包含类似这样的行:
192.168.1.100 - - [10/Jan/2024:14:22:03 +0800] "GET /api/v2/user/profile?uid=123 HTTP/1.1" 200 1245
需从中提取 Request URL Path(即 /api/v2/user/profile),并做归一化处理:
- 去除查询参数(
?uid=123)、锚点(#section)等干扰项 - 统一尾部斜杠(如
/user/→/user) - 可选:截取前 N 级路径作为模块标识,例如取前 3 段:
/api/v2/user→user;/api/v2/order/list→order
定义业务模块映射规则
不能直接用原始路径名统计(如 /v2/users/123 和 /users/detail?id=123 可能都属于“用户详情”功能),需建立路径到业务模块的映射关系。常见方式有:
- 正则匹配:如
^/api/.*?/(user|users|account)/.*$→ 模块名user - 前缀匹配:如路径以
/order/、/api/v[0-9]+/orders开头 → 归为order模块 - 配置文件驱动:维护一个
path-to-module.conf,每行写^/api/v2/product/.*$=product,便于运维调整
使用脚本或工具进行聚合统计
推荐用轻量方案快速验证,无需引入大数据平台:
- Linux 命令组合(适合日均 GB 级日志):
awk '{print $7}' access.log | sed -E 's/\?.*$//; s#/+$##' | awk -F'/' '{if(NF>3) print $3,$4; else print $3}' | sort | uniq -c | sort -nr
(提取第7字段路径 → 去参去尾斜杠 → 按/切分取第3、4段粗略识别模块 → 统计排序) - Java 程序读取日志(适合集成进监控系统):
使用BufferedReader逐行解析,用Pattern匹配预设规则,用HashMap累加各模块计数,最后按值倒序输出 - ELK 或 Grafana+Loki:若已有日志平台,可在 Logstash 或 Loki pipeline 中添加 path 解析和 label 打标(如
module=user),再通过 Kibana 或 Grafana 按module分组统计 PV/UV
注意区分真实业务访问与干扰流量
原始日志中常混入非业务请求,直接统计会导致偏差:
- 过滤掉健康检查路径(如
/health、/actuator/health) - 排除静态资源(
.js、.css、/images/)——它们反映的是前端而非后端业务热度 - 识别爬虫或扫描器请求(User-Agent 含
sqlmap、nmap,或路径含/phpmyadmin、/wp-admin) - 关注 200/302 状态码为主,忽略大量 404/499(客户端断连)等无效访问
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










