如果你想从 Apache 的 access_log 中提取 HTTP 状态码分布,首先要确认 LogFormat 里包含 %s 字段,这个字段通常位于第 9 列。随后可以借助 awk 过滤掉非数字项,再按照不同状态码进行分类统计。进一步还可以继续深入分析,例如查看各类状态码占比、按小时维度切片统计,或者接入 ELK、Prometheus 等监控平台实现可视化监控与告警。

如果要直接从 Apache 的 access_log 日志中提取状态码分布,核心可以归纳为三步:先确认字段位置是否正确,再排除无效或干扰数据,最后按状态码类别进行统计分析。Apache 默认支持在访问日志中记录状态码,对应字段就是 %>s;但前提是当前日志格式确实启用了该字段。实际做 Apache 日志分析时,还要注意一些细节,比如缺失值(如“-”)以及非数字内容,这些都需要提前过滤,否则最终的状态码统计结果很容易出现偏差。
确认日志格式是否含状态码字段
先检查 Apache 配置中的 LogFormat,确保其中包含 %>s(表示最终响应状态码),这是进行 Apache 访问日志状态码统计的前提。推荐直接使用或自定义为:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %D" combined- 同时确认
CustomLog已引用该日志格式,例如:CustomLog /var/log/apache2/access.log combined - 重启 Apache 后,可通过
head -1 access.log查看一行示例日志,再按空格分隔字段位置逐一确认——在常见的 combined 格式中,状态码一般位于第9列
用命令行快速统计状态码频次
这种方式适合日常排查、运维巡检或低流量网站分析,无需额外部署日志平台,直接就能完成 Apache 状态码统计:
- 统计全部状态码出现次数(排除“-”等无效值):
awk '$9 != "-" && $9 ~ /^[0-9]+$/ {print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -nr - 只查看错误状态码(4xx/5xx):
awk '$9 ~ /^4[0-9]{2}|^5[0-9]{2}$/ {print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -nr - 按小时维度切片统计(需要先提取时间戳):
awk -F'[' '{gsub(/]/,"",$2); print $2,$9}' /var/log/apache2/access.log | awk '$2 != "-" && $2 ~ /^[0-9]+$/ {hour=substr($1,1,13); count[hour,$2]++} END {for (k in count) print k, count[k]}' | sort
区分状态码大类并计算占比
仅看数量往往不够直观,把总请求量和状态码占比结合起来分析,更容易判断网站服务是否健康,也更适合做 Web 日志分析:
- 先统计总请求数以及各类状态码数量:
awk '$9 != "-" && $9 ~ /^[0-9]+$/ {total++; if($9 ~ /^2[0-9]{2}/) s2xx++; else if($9 ~ /^3[0-9]{2}/) s3xx++; else if($9 ~ /^4[0-9]{2}/) s4xx++; else if($9 ~ /^5[0-9]{2}/) s5xx++} END {print "2xx:", s2xx/total*100 "%; 3xx:", s3xx/total*100 "%; 4xx:", s4xx/total*100 "%; 5xx:", s5xx/total*100 "%"}' /var/log/apache2/access.log - 如果需要导出为 CSV 供 Excel 或表格工具进一步分析,可以增加
printf做格式化输出,例如:printf "%s,%dn", $9, count[$9]
对接监控系统做持续可视化
在生产环境中,建议将 Apache 日志状态码统计纳入持续监控体系,减少人工翻日志的成本,并及时发现异常请求或服务故障:
- 可以使用
filebeat采集访问日志,再通过grok过滤器提取response_code字段,并写入 Elasticsearch - 在 Kibana 中创建饼图、柱状图或堆叠图,按
response_code聚合展示,同时支持基于vhost或path继续下钻分析 - 如果已经使用 Prometheus,配合
apache_exporter可直接采集类似apache_httpd_request_duration_seconds_count{code="200"}的指标,并在 Grafana 中设置告警,例如当 5xx 占比超过 1% 时自动触发通知
