应通过log_format监控缓存分发实时带宽水位,核心是精准注入业务线标识(如X-Biz-Code或map映射)和真实响应流量($bytes_sent),定义含$time_iso8601、$biz_code、$bytes_sent等字段的日志格式,配合秒级刷盘、实时采集与分钟级SUM聚合,实现按业务线计算MB/s带宽水位并告警。

要通过 log_format 监控各业务线在缓存分发(如 CDN 或 Nginx 反向代理层)下的实时带宽水位,核心是把“业务线标识”和“实际响应流量”两个关键维度精准注入日志,并确保可聚合、低延迟、无歧义。
明确业务线标识来源
不能依赖客户端传参或 URL 路径硬编码,容易被绕过或不一致。推荐以下稳定方式:
- 在上游负载均衡或网关层统一注入
X-Biz-Code或X-Service-NameHTTP 头,值为标准化的业务线代号(如shop、pay、media) - 若使用 Nginx 作缓存节点,可在
location或map块中根据host、uri或upstream名称映射出业务线,例如:
map $host $biz_code {
~^shop\.example\.com$ "shop";
~^api\.pay\.example\.com$ "pay";
default "unknown";
} - 确保该变量在
log_format中可用(Nginx 1.11.0+ 支持任意 map 变量直接引用)
定义带宽强关联的日志格式
带宽水位本质是单位时间内的字节输出速率,需记录每条响应的真实传输量,而非仅 $body_bytes_sent(它不含响应头)。应使用 $bytes_sent —— 它包含响应头 + 响应体全部发送字节数,才是真实出口带宽贡献值。
示例格式(命名为 bandwidth_log):
'$time_iso8601|$biz_code|$status|$bytes_sent|$request_time|$upstream_http_x_cache';
-
$time_iso8601:标准 ISO 时间,便于按秒/分钟对齐窗口统计 -
$biz_code:上一步提取的业务线标识,用于分组 -
$bytes_sent:真实出口字节数,是带宽计算唯一可靠依据 -
$upstream_http_x_cache:可选,用于区分 HIT/MISS,辅助分析缓存效率对带宽的影响
对接实时采集与聚合分析
日志本身只是原始数据,需配套链路才能形成带宽水位视图:
- 将
access_log /var/log/nginx/bandwidth.log bandwidth_log buffer=64k flush=1s;加入 server 或 location,启用缓冲并按秒刷盘,平衡性能与实时性 - 用 Logtail 或 Filebeat 采集该日志文件,开启行首识别(如基于
$time_iso8601的时间戳正则),确保高吞吐下不丢行、不分割错误 - 在日志服务(如 SLS、ES)中按分钟窗口(
GROUP BY TUMBLING(minute, __time__))、biz_code分组,对bytes_sent做 SUM,再除以 60 得到平均 MB/s - 叠加告警:当某业务线带宽连续 3 分钟 > 阈值(如 50MB/s),触发通知;同时对比历史同期,识别异常突增
注意缓存分发场景下的特殊校验
在多层缓存(如 CDN → Nginx → Origin)架构中,Nginx 日志中的 $bytes_sent 只反映本层出口,不代表最终用户侧带宽。若需端到端带宽水位,应优先采集 CDN 边缘节点日志。若只能用 Nginx,则需确认其是否作为最外层缓存节点 —— 否则应将 $upstream_addr 和 $upstream_response_length 一并记录,交叉验证回源流量占比。










