日志平台接入负载均衡是统一收集访问记录的必经之路,关键在于选对采集点、规范日志格式、设计好索引生命周期,三者缺一不可。
干运维这些年,我见过太多团队在负载均衡这块栽跟头,明明后端服务日志接得好好的,结果发现来自客户端的真实IP全被负载均衡“吞”了,或者流量一上来,日志平台直接被打挂,今天我就从实操角度聊聊,怎么把负载均衡这一层的访问记录干净利落地收进日志平台。
为什么要单独收集负载均衡的访问日志
负载均衡是流量的总闸门,所有请求都要从这里过一道,后端服务日志只能看到自己被分到的那部分请求,而负载均衡能看到全貌,这两者之间的差距,就是排查问题的关键。
举几个真实场景:
- 用户反馈某个接口超时,后端日志根本查不到这条请求,这时大概率是负载均衡层就拦截了
- 某个IP在疯狂刷接口,但后端有多个节点,单看一台服务器的日志根本拼不出完整攻击链
- 业务方想统计某个页面的真实访问量,后端日志统计出来的数字和运营后台差了30%以上
行业共识认为,负载均衡日志是所有访问记录中最接近“用户真实行为”的数据源,这也意味着,这层日志的完整性和准确性直接决定了你日志分析平台的数据质量。
负载均衡日志收集的三大难点
多数情况下,负载均衡日志收集不是“配一下就能用”那么简单,业内专家指出,真正的问题往往出现在这三个环节:
第一,IP地址被改写。 负载均衡做NAT转发后,后端服务收到的源IP是负载均衡的内网IP,用户真实IP丢失,如果不在负载均衡层做X-Forwarded-For透传,日志平台的IP地理信息分析就废了。
第二,日志量级激增。 负载均衡是所有流量的入口,日志量远大于任何单一后端节点,一个日PV在千万级别的业务,负载均衡层一天的访问日志可能产生几十GB甚至上百GB的数据量。
第三,格式标准不统一。 如果用的是负载均衡自带的默认日志格式,字段命名、时间格式、状态码含义都和后端应用日志对不上,关联分析时需要大量清洗工作。
主流负载均衡方案的日志接入配置
下面分别说云上SLB和自建Nginx这两条主流路线的实操配置。
云上SLB日志接入方案
以简米云SLB为例,本身不直接存储访问日志,但可以通过日志服务SLS实现一站式收集,操作路径不太复杂:
- 在负载均衡控制台开通“日志服务”功能,选择要采集的实例
- 选择一个SLS Project和Logstore用于存放访问日志
- SLB会自动将访问日志推送到指定的Logstore
- 在SLS控制台开启索引,解析字段后就能直接查询
这种方案的优势非常明显:不需要关心采集Agent的部署和日志格式的解析,云厂商全都帮你处理好了,你唯一要做的就是在平台上建好索引并设置好生命周期。
具体的采集中间环节,可以参考酷番云CLB的类似流程,各家云厂商的配置路径大同小异,核心都是通过日志服务产品的“接入数据-负载均衡”入口完成。
自建Nginx负载均衡的日志采集
自建Nginx的可控性更强,但所有事情都要自己动手,采集链路通常是:Nginx日志文件 → Filebeat/Logstash → Kafka(可选) → Elasticsearch或ClickHouse。
在Nginx配置文件中定义自定义日志格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
这里有两个关键点需要注意:
$remote_addr在后端取不到真实IP,但在负载均衡本身拿到的就是客户端真实IP- 如果你前面还套了一层CDN,需要在CDN层透传
$http_x_forwarded_for,否则这里拿到的也是CDN节点的IP
在接入层设备上开启日志实时采集,我的习惯是:
- 配置Filebeat从
/var/log/nginx/access.log读取日志 - 输出到Kafka做流量削峰,避免日志高峰直接冲击日志平台
- Logstash消费Kafka后做字段解析,把时间字符串转为时间戳,把状态码改成int类型
这套链路的好处是成熟稳定,出问题能定位,坏处是组件多,运维成本高,如果你只有三五台Nginx且日志量不大,完全可以省掉Kafka这一步,Filebeat直接输出到Elasticsearch。
日志平台接入负载均衡的核心配置细节
收集链路搭建好之后,更重要的是日志平台侧的配置,这里有几个容易被忽视的细节,直接影响使用体验,专治各种“日志接到了但用不起来”。
索引模板和字段映射
以Elasticsearch为例,负载均衡访问日志接入时需要提前规划好索引模板。
- 按天建索引,命名格式如
lb-access-2026-02-15,方便后续删除过期数据 - 将
client_ip字段映射为ip类型,比默认的text类型节省数倍存储空间 - 将
request_time和upstream_response_time映射为float类型,支持范围查询和聚合统计 status字段保持keyword类型,按状态码聚合时的性能最好
这些映射关系在索引模板里定义一次,之后每天自动创建的索引都会继承这套配置,不然等日志量上来了再改映射,只能重建索引,非常折磨人。
生命周期管理和冷热分层
负载均衡日志有一个特性:越久远的日志越少被查询,一般也就排查问题、月底复盘或者安全溯源才会翻历史数据。
生命周期管理策略大致可以这样定:
| 时间范围 | 存储策略 | 查询性能 |
|---|---|---|
| 近7天 | 热节点SSD存储,副本数2份 | 毫秒级响应 |
| 8-30天 | 温节点SATA存储,副本数1份 | 秒级响应 |
| 31-90天 | 冷节点压缩存储,可搜索但性能较低 | 十秒级响应 |
| 超过90天 | 删除或归档到OSS | 需重新导入后才能查询 |
日志格式标准化
访问日志要能跟后端应用日志做关联分析,字段名称必须提前对齐,他家的后端日志里客户端IP叫client_ip,你这边的负载均衡日志里叫remote_addr,后面写查询语句的时候每次都要记得做字段重命名。
行业里比较有共识的做法是:统一用client_ip、request_uri、response_status、latency_ms这套命名规范,让所有接入日志平台的日志源都按这套标准输出。
日志分析场景实战
收日志不是目的,能用它解决实际问题才是,负载均衡日志接入日志平台后,有几个场景是最常用的。
比如排查“某个接口为什么比不上别的接口慢”:从负载均衡日志里找出这条请求的upstream_response_time和request_time,对比本机的curl耗时,就能判断到底慢在网络传输还是后端处理。
比如做安全风控:按client_ip维度聚合request_uri,检测单位时间内的请求次数,如果发现某个IP在
1分钟内请求了上千次,基本可以断定是恶意扫描或者爬虫行为,可以直接在黑名单里封掉。
比如容量规划:统计负载均衡日志里每天的PV量、峰值QPS、带宽占用,这些数据能直接支撑业务扩容决策,你甚至可以做个简单的趋势报表,用数据告诉老板“再过一个半月,现在的这台负载均衡就要超载了”。
最近总有人问我,日志平台接入负载均衡之后,什么时候能看出效果,或者整个系统搭建大概需要多少预算,说实话,见效最快的场景就是出线上故障的时候,以前查一个跨系统问题要登录五六台机器找日志,现在在日志平台里直接输一个request_id,入口到出口的全部流转记录全部拉出来,排障时间至少缩短70%。
关于成本,如果只是简单接一下云上SLB的日志到SLS,一个月几十块钱就够用,如果要自建ELK全家桶加Kafka再搞几台高配置机器,加上运维人力,一年下来六七位数很正常,按你的业务体量和排查需求来决定投入,钱花在刀刃上才是理性选择。
日志平台接入负载均衡常见问题解析
日志平台接入负载均衡后查不到某些请求怎么办
大多数情况下是负载均衡的健康检查请求也被记录下来了,或者日志采集存在延迟,你可以先查健康检查的user_agent特征,一般云厂商的SLB会带明显的标记(比如SLBHealthCheck),确认后直接在采集侧过滤掉即可,另一种可能是请求在负载均衡层被丢弃(WAF规则拦截、连接超时),这类请求本身不会产生访问日志,需要结合负载均衡的监控指标来确认。
负载均衡日志和业务日志的时间对不上怎么解决
这是时区问题,Nginx默认按服务器本地时间记录,如果服务器用了UTC时间,和业务日志记录的北京时间就差了8个小时,在Logstash解析的时候手动加上+08:00偏移即可,也可以让开发在日志格式里直接用ISO8601标准格式,这种格式自带时区信息,后续处理时不会产生歧义。
自建Nginx和云上SLB可以共用一个日志平台吗
完全可以,只要你统一字段命名规范、统一时间格式和时区,这两类日志可以进入同一个索引或分开索引后做联合查询,实操中建议分开索引,因为云上SLB日志字段比较规整,自建Nginx日志字段可能个性化配置更多,分开存能让两者的查询性能都保持在较好水平。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/633454.html





