apache本身不直接生成状态码分布图表,但通过配置logformat确保日志含%>s字段、结合awk/elk/grafana等工具解析access.log,可准确统计并可视化2xx/4xx/5xx分布。

Apache 本身不直接生成状态码分布图表,但能准确记录每个请求的 HTTP 状态码(如 200、404、500),后续通过日志分析和可视化工具就能统计分布情况。关键在于确保日志格式完整、采集方式可靠、解析逻辑清晰。
确保日志中包含准确的状态码字段
Apache 默认的 common 日志格式已含 %>s,它记录的是最终返回给客户端的响应状态码,无论请求是否经过反向代理(如转发到 Java 后端),这个值都是真实生效的。推荐使用 combined 格式并显式确认:
- 检查
httpd.conf或apache2.conf中的LogFormat行,确保包含%>s和可选的响应耗时%D - 示例格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined - 在虚拟主机或主配置中启用:
CustomLog /var/log/apache2/access.log combined
按需区分代理层与后端真实状态码
当 Apache 作为反向代理(如用 mod_proxy 转发至 Tomcat)时,%>s 是最终响应码,但你可能还想看到后端 Java 应用返回的原始状态码。这时需靠响应头透传:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 让 Java 应用在响应中设置自定义头,例如:
X-Backend-Status: 500、X-Biz-Code: ORDER_TIMEOUT - Apache 配置中确保未屏蔽这些头(默认透传,
ProxyPassReverse不影响) - 在日志格式中加入:
%{X-Backend-Status}o,即可和%>s并列记录,用于比对定位是代理问题还是后端问题
用条件日志分离关键状态码便于监控
不需要把所有请求混在一起分析,可以用 SetEnvIf 提前打标,再配合 CustomLog 分流写入不同文件:
- 单独记录所有 5xx 错误:
SetEnvIfNoCase Status "^5" is_5xx+CustomLog logs/5xx-errors.log combined env=is_5xx - 只抓代理网关错误(502/503/504):
SetEnvIfNoCase Status "^(502|503|504)$" is_proxy_error - 排除健康探测干扰:
SetEnvIf Request_URI "^/healthz" no_log,所有日志加env=!no_log
接入分析工具生成分布图表
日志有了,下一步是解析和可视化。常见轻量到生产级方案:
-
Shell 快速验证:每分钟执行
awk '{print $9}' access.log | sort | uniq -c | sort -nr查看高频状态码 -
ELK(Elasticsearch + Logstash + Kibana):用 Grok 解析日志,提取
response_code字段,在 Kibana 做饼图、趋势图、下钻分析 -
Grafana + Prometheus:部署
apache_exporter抓取/server-status?auto,用rate(apache_httpd_request_duration_seconds_count{code=~"5.."}[5m])做 5xx 错误率告警









