温馨提示×

Apache日志中的带宽使用情况如何

小樊
44
2025-12-19 22:10:57
栏目: 编程语言

Apache日志中的带宽使用统计

一 核心概念与字段

  • 在 Apache 的访问日志中,单个请求的响应体字节数通常由字段 %b(以字节计,失败时可能为短横线“-”)或 %B(始终为字节数,失败时记为 0)记录。通过对这些字节数求和,即可得到某段时间内的总出站流量(带宽消耗的近似值)。常见日志格式如 combined 即包含这些字段。注意:日志记录的只是响应体大小,通常不包含 HTTP 头部TCP/IP 协议开销,因此与网卡层实际吞吐存在一定偏差。

二 快速统计方法

  • 统计当天总带宽(以字节计)
    • 命令:awk -F' ' '{n+=$10} END {print n}' /var/log/apache2/access.log
    • 说明:默认 combined 格式中第 10 列为 %b(字节数)。若你的日志使用 %B,请将 $10 改为 $9
  • 按天汇总(示例:2025-12-19)
    • 命令:awk -F' ' '$4 ~ /\[19\/Dec\/2025/ {n+=$10} END {print n}' /var/log/apache2/access.log
  • 按小时查看带宽趋势
    • 命令:awk -F' ' '{split($4,a,"[:[]"); h=a[2]; sum[h]+=$10} END {for (i in sum) printf "%s %d\n", i, sum[i]}' /var/log/apache2/access.log | sort -n
  • 找出“最耗带宽”的 Top N 资源
    • 命令:awk -F' ' '{print $7,$10}' /var/log/apache2/access.log | sort -k2 -nr | head -n 20
  • 按 IP 汇总带宽
    • 命令:awk -F' ' '{ip=$1; sum[ip]+=$10} END {for (i in sum) printf "%s %d\n", i, sum[i]}' /var/log/apache2/access.log | sort -k2 -nr | head
  • 如需按时间段过滤,可先用 grep 筛选后再用 awk 汇总,例如:grep "03/Aug/2023:08:" access.log | awk '{n+=$10} END {print n}'

三 更精准的带宽口径

  • 若需要把 响应头 也计入带宽,可改用自定义日志格式记录完整响应大小(包含头部),例如:
    • 配置:LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_with_body_and_header
    • 说明:字段 %O 表示“发送给客户端的字节数(含响应头)”。将此格式写入 CustomLog 后,再用前述 awk%O 列求和即可得到更贴近实际传输的带宽口径。
  • 若希望按用户或业务维度统计,可在日志中写入用户标识,例如使用 %{USERTOKEN}C(请求中的 Cookie)或 %{PHP_USER_ID}n(来自 PHP 的 apache_note),再结合 %B 记录响应体大小,实现“按用户/业务统计带宽”。

四 可视化与长期监控

  • 使用 WebalizerGraylogEventLog Analyzer 等工具对访问日志进行解析与报表生成,可定期输出按日/按资源/按来源的带宽统计图表,便于容量规划与异常排查。
  • 结合 logrotatecronolog 做日志轮转,避免单文件过大、便于按天/按周分析;实时排查可用 tail -f 观察新增请求与响应大小变化。

0