需先确认Apache日志含User-Agent字段(combined格式默认支持),再用正则提取末尾双引号内字符串,过滤空值及爬虫UA后,按Edg→Firefox→Safari(不含Chrome)→Chrome(不含Edg)→Opera优先级归类,最后统计频次并计算百分比。

要分析 Apache 访问日志中的浏览器分布,关键是准确提取并归类 User-Agent 字段内容,排除爬虫干扰后统计各浏览器出现频次与占比。核心前提是日志中必须记录了 User-Agent 信息。
确认日志包含 User-Agent 字段
默认的 combined 日志格式已包含该字段。检查 Apache 配置(如 httpd.conf 或 apache2.conf)中是否有类似配置:
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\""- 确保
CustomLog指令引用了该格式,例如:CustomLog logs/access_log combined - 若无
"%{User-Agent}i",需添加并重启 Apache 服务
提取 User-Agent 字符串
在日志行中定位 UA 字段需结合格式特点。对 combined 格式,UA 通常位于行末双引号内:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用正则
"([^"]*)"$可匹配最后一个双引号内的内容(即 UA) - Java 中推荐用
Files.lines(Paths.get("access_log"))流式读取,避免大文件内存溢出 - 注意:部分日志可能含空 UA 或异常截断,需跳过空值或长度过短的条目
识别并归类主流浏览器
User-Agent 字符串结构复杂,识别需按明确优先级,防止误判(如 Chrome 和 Edge 都含 Chrome,但 Edge 应优先匹配):
- 先匹配
Edg/→ 归为 Edge - 再匹配
Firefox/→ 归为 Firefox - 接着匹配
Safari/且不含Chrome→ 归为 Safari(排除 Chrome 冒充) - 然后匹配
Chrome/且不含Edg→ 归为 Chrome - 再匹配
OPR/或Opera/→ 归为 Opera - 其余非空 UA 可暂归为 Other;含
bot、crawler、wget、curl等关键词的建议过滤掉
统计并输出占比
使用 Map<String, Long> 累计各浏览器出现次数,再计算百分比:
- 求总有效请求数:
total = counts.values().stream().mapToLong(Long::longValue).sum() - 遍历 map,对每个浏览器执行:
(double) count / total * 100,保留两位小数 - 典型输出示例:Chrome: 62.35% Edge: 15.21% Safari: 9.87% Firefox: 8.44% Other: 4.13%

















