通过解析Nginx日志中的User-Agent字段并按主流浏览器特征正则匹配,可统计浏览器分布;需先提取清洗UA(去空、转小写),再依Chrome、Safari、Firefox、Edge、Opera、微信等规则顺序识别,最后聚合排序。

直接从 Nginx 日志里提取 User-Agent 字段,再按浏览器类型归类统计,就能得到浏览器分布。关键在于准确识别主流浏览器的 UA 特征,避免误判或漏统计。
提取并清洗 User-Agent 字段
Nginx 默认日志格式中,User-Agent 通常在 $http_user_agent 变量里,对应日志行末尾部分。先用 awk 或 cut 提取这一列,再做基础清洗:
- 去除空值或明显无效 UA(如 "-"、"-"、空格、长度过短)
- 统一转为小写,方便后续匹配(大小写不敏感但统一处理更稳妥)
- 可选:去掉重复行或去重计数前保留原始行数(用于区分独立访问与总请求数)
识别主流浏览器的 UA 模式
浏览器 UA 字符串没有严格标准,但有稳定标识。常见识别逻辑如下(建议用正则逐条匹配,顺序很重要):
-
Chrome:含
chrome/且不含edg/、opr/、brave/(避免被 Edge、Opera、Brave 误覆盖) -
Safari:含
safari/且不含chrome/、crios/(排除 Chrome on iOS) -
Firefox:含
firefox/且不含seamonkey/ -
Edge:含
edg/(新版 Chromium Edge)或edge/(旧版 EdgeHTML) -
Opera:含
opr/(新版 Opera)或opera/(旧版) -
微信内置浏览器:含
micromessenger/且不含miniprogram(可单独分出小程序) - 其余归为 “Other” 或进一步细分(如 QQ 浏览器、360、UC 等)
用命令行快速统计(适合日常排查)
假设日志路径为 /var/log/nginx/access.log,可用以下组合命令一键输出 Top 10 浏览器分布:
awk '{match($0, /"([^"]+)"/, arr); print arr[1]}' /var/log/nginx/access.log | \
grep -v '^-$' | \
awk '{
ua = tolower($0)
if (ua ~ /edg\//) {b["Edge"]++}
else if (ua ~ /opr\//) {b["Opera"]++}
else if (ua ~ /chrome\// && ua !~ /edg\// && ua !~ /opr\//) {b["Chrome"]++}
else if (ua ~ /firefox\//) {b["Firefox"]++}
else if (ua ~ /safari\// && ua !~ /chrome\//) {b["Safari"]++}
else if (ua ~ /micromessenger\//) {b["WeChat"]++}
else {b["Other"]++}
} END {for (i in b) print b[i], i}' | \
sort -nr | head -10
注意:实际使用时建议把这段逻辑封装成脚本,支持指定日期范围(配合 zcat 处理压缩日志)和输出格式(CSV 更易导入图表工具)。
进阶:用 Python 或 ELK 做持续分析
如果需要定期生成报表或对接监控看板,推荐用 Python + pandas 或接入 ELK(Elasticsearch + Logstash + Kibana):
- Python 脚本可加载日志,用
user_agents库解析 UA,自动识别浏览器名、版本、OS,精度更高 - ELK 中通过 Logstash 的
useragent过滤器提取字段,Kibana 直接建柱状图或饼图,支持按时间下钻 - 注意 UA 字段长度限制(默认 4096 字节),超长可能被截断,影响识别,Nginx 可调大
log_format中的缓冲区


















