强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

GoAccess 日志分析完全指南 / 09 - 指标分析

09 - 指标分析

9.1 概述

GoAccess 提供的不仅仅是数字,而是可以驱动业务决策的洞察。本章将逐项解读每个核心指标的含义、分析方法和实际应用场景,帮助你从日志数据中提取最大价值。

┌─────────────────────────────────────────────────┐
│               GoAccess 指标体系                  │
├─────────────────────────────────────────────────┤
│                                                  │
│  流量指标        用户指标        质量指标         │
│  ─────────      ─────────      ─────────        │
│  · 请求量 (Hits) · 独立访客 (UV) · 状态码分布     │
│  · 带宽 (Bw)    · IP 排行       · 404 页面       │
│  · 请求文件      · 地理位置      · 请求耗时       │
│                                                  │
│  来源指标        设备指标                         │
│  ─────────      ─────────                       │
│  · 来源站点      · 操作系统                       │
│  · 来源 URL      · 浏览器                         │
│                  · TLS 版本                       │
└─────────────────────────────────────────────────┘

9.2 访问量指标(Hits)

9.2.1 指标定义

术语英文说明
总请求量Total Hits日志中所有请求的总和
有效请求Valid Requests成功解析的请求数
失败请求Failed Requests解析失败的请求数(格式不匹配等)
排除请求Excluded Hits被过滤规则排除的请求数

9.2.2 分析方法

# 查看总体访问量
goaccess access.log --log-format=COMBINED

# 终端面板中关注:
# General Dashboard → Hits 字段

# 使用 JSON 导出精确数值
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '.general | {total: .total_requests, valid: .valid_requests, failed: .failed_requests}'

9.2.3 业务场景

场景一:流量趋势分析

# 生成每日报告,观察趋势
for day in $(seq 1 31); do
    DATE=$(printf "202605%02d" $day)
    COUNT=$(grep "$(printf '%02d/May/2026' $day)" access.log | wc -l)
    echo "${DATE}: ${COUNT} 次请求"
done

场景二:异常流量检测

# 对比今日与往日平均值
TODAY=$(grep "$(date +%d/%b/%Y)" access.log | wc -l)
AVG=$(cat /tmp/historical_avg.txt)  # 历史平均值

THRESHOLD=$(echo "$AVG * 2" | bc)
if [ "$TODAY" -gt "$THRESHOLD" ]; then
    echo "⚠️ 流量异常!今日: ${TODAY}, 历史均值: ${AVG}"
fi

9.2.4 注意事项

  • Hits ≠ 访客:一个用户可能产生多个 Hits
  • 爬虫影响:爬虫请求也计入 Hits,需要排除后分析真实用户
  • 静态资源:JS/CSS/图片也会产生 Hits,通常需要排除分析业务请求

9.3 独立访客指标(Unique Visitors)

9.3.1 指标定义

GoAccess 使用 IP 地址 作为访客唯一标识。同一 IP 在分析时间范围内只计为一个独立访客。

术语说明
Unique Visitors (UV)不重复的 IP 数量
Hits per Visitor平均每个访客的请求数

9.3.2 分析方法

# 终端面板查看访客排行
# 面板 1: Unique Visitors
# 显示: IP、请求数、访客占比

# 按访客数排序
goaccess access.log --log-format=COMBINED \
  --sort-panel=VISITORS,BY_VISITORS

# 导出 Top 20 访客 IP
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '.visitors.data[:20] | .[] | {ip: .data, hits: .hits.count, visitors: .visitors.count}'

9.3.3 局限性

问题说明改进方案
NAT/代理多个用户共享同一 IP使用 X-Forwarded-For
动态 IP同一用户每次 IP 不同使用 Cookie/Session ID
爬虫爬虫 IP 也算访客排除已知爬虫 UA
IPv6不同设备可能共享前缀考虑使用 /64 前缀去重

9.3.4 业务场景

# 排除爬虫后的真实访客数
goaccess access.log --log-format=COMBINED \
  --exclude='(bot|crawler|spider|slurp|Bytespider|GPTBot)' \
  --exclude='\.(css|js|jpg|png|gif|ico|svg|woff2?)$'

9.4 带宽指标(Bandwidth)

9.4.1 指标定义

术语说明
总带宽所有响应体大小之和
平均请求大小总带宽 / 总请求数
排除带宽排除静态资源后的带宽

9.4.2 分析方法

# 终端面板查看带宽统计
# General Dashboard → Bandwidth 字段

# 按带宽排序请求文件
goaccess access.log --log-format=COMBINED \
  --sort-panel=REQUESTS,BY_BANDWIDTH

# 查看带宽消耗最大的文件
# 面板 2 (Requested Files) → 按 Bandwidth 列排序

9.4.3 业务场景

场景一:识别带宽瓶颈

# 找出带宽消耗 Top 10 的请求
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '.requests.data[:10] | .[] | "\(.data): \(.bandwidth.count) bytes (\(.hits.count) hits)"'

场景二:CDN 效果评估

# 分析静态资源的带宽占比
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '{
    total_bw: .general.bandwidth,
    static_bw: (.static_requests.data | map(.bandwidth.count) | add),
    ratio: ((.static_requests.data | map(.bandwidth.count) | add) / .general.bandwidth * 100)
  }'

9.4.4 带宽优化建议

场景优化方案
静态资源占比高启用 CDN、开启 Gzip/Brotli
大文件下载限制下载速度、使用分片下载
API 响应过大启用 API 压缩、分页返回
重复请求多设置合理的 Cache-Control

9.5 请求文件分析

9.5.1 分析维度

指标说明分析价值
请求量排序最常被访问的 URL热门内容识别
带宽排序消耗最多带宽的 URL带宽优化方向
访客排序访问人数最多的 URL内容覆盖分析
平均大小单次请求的平均大小响应优化评估

9.5.2 分析方法

# 查看请求文件排行
# 面板 2: Requested Files

# 导出热门页面 Top 20
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '.requests.data[:20][] | {url: .data, hits: .hits.count, percent: .hits.percent}'

# 按访客数排序
goaccess access.log --log-format=COMBINED \
  --sort-panel=REQUESTS,BY_VISITORS

9.5.3 业务场景

场景一:内容运营分析

# 分析博客文章的访问量
grep '"/items/' access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=REQUESTS,BY_HITS \
  --ignore-panel=HOSTS \
  --ignore-panel=GEO_LOCATION \
  --ignore-panel=REFERRING_SITES \
  -

场景二:API 使用分析

# 分析 API 端点的使用情况
grep '"/api/' access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=REQUESTS,BY_HITS \
  --ignore-panel=GEO_LOCATION \
  --ignore-panel=REFERRING_SITES \
  -

9.6 状态码分析

9.6.1 状态码分类

状态码范围含义说明
2xx成功正常响应
3xx重定向URL 跳转
4xx客户端错误请求有问题
5xx服务器错误服务端异常

9.6.2 常见状态码

状态码名称可能原因
200OK正常请求
301Moved Permanently永久重定向
302Found临时重定向
304Not Modified缓存命中
400Bad Request请求格式错误
401Unauthorized未认证
403Forbidden权限不足
404Not Found资源不存在
429Too Many Requests请求频率过高
500Internal Server Error服务端异常
502Bad Gateway上游服务异常
503Service Unavailable服务不可用
504Gateway Timeout上游超时

9.6.3 分析方法

# 终端面板查看状态码分布
# 面板 10: HTTP Status Codes

# 只分析错误请求
goaccess access.log --log-format=COMBINED \
  --status-code=4xx --status-code=5xx

# 导出状态码分布
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '.status_codes.data[] | "\(.data): \(.hits.count) (\(.hits.percent)%)"'

9.6.4 状态码健康度评估

#!/bin/bash
# status_health.sh — 状态码健康度评估

LOG_FILE="/var/log/nginx/access.log"

TOTAL=$(wc -l < "${LOG_FILE}")
S200=$(grep -c '" 200 ' "${LOG_FILE}")
S404=$(grep -c '" 404 ' "${LOG_FILE}")
S500=$(grep -c '" 500 ' "${LOG_FILE}")
S502=$(grep -c '" 502 ' "${LOG_FILE}")

PCT_200=$(echo "scale=2; ${S200} * 100 / ${TOTAL}" | bc)
PCT_404=$(echo "scale=2; ${S404} * 100 / ${TOTAL}" | bc)
PCT_5XX=$(echo "scale=2; (${S500} + ${S502}) * 100 / ${TOTAL}" | bc)

echo "===== 状态码健康度报告 ====="
echo "总请求:  ${TOTAL}"
echo "200 OK:  ${S200} (${PCT_200}%)"
echo "404:     ${S404} (${PCT_404}%)"
echo "5xx:     $((S500 + S502)) (${PCT_5XX}%)"
echo ""

# 健康评级
if (( $(echo "${PCT_5XX} > 1" | bc -l) )); then
    echo "⚠️  健康状态: 差 — 5xx 错误率 > 1%"
elif (( $(echo "${PCT_5XX} > 0.1" | bc -l) )); then
    echo "🔶 健康状态: 注意 — 5xx 错误率 > 0.1%"
else
    echo "✅ 健康状态: 良好"
fi

9.6.5 404 页面深度分析

# 分析 404 页面 — 发现死链和扫描行为
grep '" 404 ' /var/log/nginx/access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=REQUESTS,BY_HITS \
  --ignore-panel=GEO_LOCATION \
  --ignore-panel=REFERRING_SITES \
  --ignore-panel=BROWSERS \
  --ignore-panel=OS \
  -

404 分析的业务价值

模式可能原因行动建议
/old-page.html内容迁移未设置重定向添加 301 重定向
/wp-admin扫描器探测忽略或封禁 IP
/api/v1/old-endpointAPI 版本变更更新客户端/文档
/images/old-logo.png资源被删除但仍被引用更新引用或恢复资源

9.7 来源页分析(Referrer)

9.7.1 指标说明

面板说明用途
Referring Sites来源域名排行识别流量来源渠道
Referring URLs来源完整 URL精确定位引流页面

9.7.2 分析方法

# 查看来源站点排行
# 面板 8: Referring Sites

# 查看来源 URL 排行
# 面板 9: Referring URLs

# 只分析来自搜索引擎的流量
grep -iE '(google\.com|bing\.com|baidu\.com|sogou\.com)' \
  access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=REFERRING_SITES,BY_HITS \
  -

9.7.3 业务场景

场景一:SEO 效果评估

# 分析搜索引擎来源
grep -iE '(google|bing|baidu|sogou|yandex)' access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=REFERRING_URLS,BY_HITS \
  --ignore-panel=HOSTS \
  --ignore-panel=OS \
  --ignore-panel=BROWSERS \
  -

场景二:营销渠道分析

# 分析社交媒体来源
grep -iE '(facebook|twitter|weibo|wechat|zhihu|douyin)' \
  access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=REFERRING_SITES,BY_HITS \
  -

9.8 地理位置分析

9.8.1 前置条件

需要配置 GeoIP 数据库(见 02 - 安装与配置 的 GeoIP 配置章节)。

9.8.2 分析方法

# 启用地理位置面板
goaccess access.log --log-format=COMBINED \
  --geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb

# 终端面板 12: Geo Location
# 显示: 国家、城市、请求数、访客数

9.8.3 业务场景

场景一:国际化分析

# 导出国家分布
goaccess access.log --log-format=COMBINED \
  --geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb \
  -o - --no-global-config | \
  jq '.geolocation.data[:20][] | "\(.data): \(.hits.count) hits, \(.visitors.count) visitors"'

场景二:区域合规分析

# 识别来自特定国家的流量(如 GDPR 合规需求)
goaccess access.log --log-format=COMBINED \
  --geoip-database=/usr/share/GeoIP/GeoLite2-City.mmdb \
  --sort-panel=GEO_LOCATION,BY_VISITORS

9.9 设备与浏览器分析

9.9.1 操作系统分布

# 面板 6: Operating Systems
goaccess access.log --log-format=COMBINED \
  --sort-panel=OS,BY_VISITORS

9.9.2 浏览器分布

# 面板 7: Browsers
goaccess access.log --log-format=COMBINED \
  --sort-panel=BROWSERS,BY_VISITORS

9.9.3 业务场景

场景一:浏览器兼容性评估

# 识别需要支持的浏览器版本
goaccess access.log --log-format=COMBINED -o - --no-global-config | \
  jq '.browsers.data[:10][] | "\(.data): \(.visitors.count) visitors (\(.visitors.percent)%)"

场景二:移动端占比分析

# 提取移动端 UA 分析
grep -iE '(mobile|android|iphone|ipad)' access.log | \
  goaccess --log-format=COMBINED \
  --sort-panel=BROWSERS,BY_VISITORS \
  --ignore-panel=HOSTS \
  --ignore-panel=GEO_LOCATION \
  -

9.10 请求耗时分析

9.10.1 前置条件

日志中需要包含请求耗时字段(Nginx 的 $request_time):

log_format timed '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent" $request_time';

9.10.2 分析方法

# 使用包含耗时字段的格式
goaccess access.log \
  --log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
  --date-format=%d/%b/%Y \
  --time-format=%H:%M:%S

# GoAccess 会自动添加请求耗时相关的面板
# - Avg. T.S. (平均耗时)
# - Cum. T.S. (累计耗时)
# - Max T.S. (最大耗时)

9.10.3 排序与分析

# 按平均耗时排序请求文件
goaccess access.log \
  --log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
  --date-format=%d/%b/%Y \
  --time-format=%H:%M:%S \
  --sort-panel=REQUESTS,BY_AVGTS

# 按最大耗时排序
goaccess access.log \
  --log-format='%h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" %T' \
  --date-format=%d/%b/%Y \
  --time-format=%H:%M:%S \
  --sort-panel=REQUESTS,BY_MAXTS

9.11 综合指标仪表盘

#!/bin/bash
# metrics_dashboard.sh — 生成综合指标仪表盘

LOG_FILE="/var/log/nginx/access.log"
REPORT="/var/www/html/dashboard.html"

# 使用持久化模式
DB_FILE="/tmp/goaccess_metrics.db"

goaccess "${LOG_FILE}" --log-format=COMBINED \
  -o "${DB_FILE}" --persist 2>/dev/null

goaccess "${DB_FILE}" --restore \
  -o "${REPORT}" \
  --html-title="综合指标仪表盘" \
  --html-prefs='{"theme":"bright","perPage":25}' \
  --sort-panel=VISITORS,BY_VISITORS \
  --sort-panel=REQUESTS,BY_HITS \
  --sort-panel=HOSTS,BY_HITS

echo "仪表盘已生成: ${REPORT}"

9.12 指标分析最佳实践

实践说明
排除噪音过滤爬虫、静态资源、健康检查后再分析
对比分析将当期数据与上期对比,观察趋势
多维度交叉不要只看单一指标,结合访客+状态码+带宽综合分析
定期生成使用 Cron/Timer 定期生成报告,保持监控连续性
导出存档保留 JSON/CSV 历史数据,便于回溯分析
业务驱动根据业务目标选择关注指标(SEO→来源页,性能→耗时,安全→状态码)

9.13 小结

指标面板关键问题
请求量通用仪表盘流量是否正常?有无异常峰值?
访客面板 1真实用户有多少?趋势如何?
热门页面面板 2哪些内容最受欢迎?
带宽通用仪表盘带宽消耗合理吗?需要优化吗?
状态码面板 10错误率是多少?需要排查什么?
404面板 4有死链吗?有扫描行为吗?
来源页面板 8/9流量从哪来?SEO 效果如何?
地理面板 12用户分布在哪里?
设备面板 6/7移动端占比多少?

下一章

下一章将介绍 GoAccess 的自动化集成方案,包括定时报告、告警机制、CI/CD 集成和邮件通知。

10 - 自动化集成


扩展阅读