要让 Apache 记录负载均衡调度决策日志,关键是自定义 LogFormat 捕获 balancer 模块内部变量(如 %{BALANCER_NAME}e、%{BALANCER_WORKER_ROUTE}e 等),并确保 mod_proxy_balancer、mod_headers、mod_env、mod_proxy_http 已启用,同时每个 BalancerMember 显式配置 route= 参数,配合 stickysession 实现会话相关字段填充,最终生成含客户端IP、时间、后端路由及粘性信息的结构化日志。

要让 Apache 记录负载均衡调度决策日志,关键不是启用某个开关,而是主动捕获 balancer 模块内部变量,并写入结构化日志。默认访问日志完全不体现“请求被分发到哪台后端”,必须自定义 LogFormat 并确保相关模块已加载。
启用必要模块
确认以下模块已启用(通常需在 httpd.conf 或 apache2.conf 中检查):
-
mod_proxy_balancer(核心负载均衡支持) -
mod_headers(用于透传或设置标识) -
mod_env(用于条件日志记录) -
mod_proxy_http(转发 HTTP 请求必需)
可通过命令验证:
apachectl -M | grep -E 'proxy|balancer|headers|env'
定义含调度信息的日志格式
在 <VirtualHost> 外全局或局部配置中添加:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \
%{BALANCER_NAME}e %{BALANCER_WORKER_ROUTE}e \
%{BALANCER_SESSION_STICKY}e %{BALANCER_SESSION_ROUTE}e" combined_balancer
CustomLog logs/access_balancer.log combined_balancer其中关键变量说明:
-
%{BALANCER_NAME}e:当前使用的 balancer 名称(如mycluster) -
%{BALANCER_WORKER_ROUTE}e:实际选中的后端节点 route(如node1) -
%{BALANCER_SESSION_STICKY}e:会话粘性键值(如JSESSIONID=abc123) -
%{BALANCER_SESSION_ROUTE}e:该会话绑定的后端 route(如route=node1)
确保后端 route 正确声明
每个 BalancerMember 必须显式指定 route=,否则上述变量为空:
<Proxy balancer://mycluster> BalancerMember http://192.168.1.10:8080 route=node1 BalancerMember http://192.168.1.11:8080 route=node2 ProxySet lbmethod=byrequests </Proxy>
若使用 Cookie 粘滞(如 stickysession=JSESSIONID),后端应用需返回含 Set-Cookie: JSESSIONID=xxx; Path=/; HttpOnly 的响应,Apache 才能解析并填充 BALANCER_SESSION_ROUTE。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
补充真实客户端 IP 和时间可信度
- 若前端有 Nginx 或 CDN,用
mod_remoteip替换%h,避免日志全是代理 IP - 所有 Apache 节点必须运行 NTP 客户端,时间误差控制在 1 秒内,便于后续跨节点日志关联
日志字段示例(一行):
192.168.1.200 - - [15/June/2026:08:22:14 +0000] "GET /api/user HTTP/1.1" 200 124 "-" "curl/7.68.0" mycluster node1 JSESSIONID=7f8a1b2c node1
这样每条日志就完整记录了谁、何时、请求什么、被分到哪台机器、是否带会话粘性——为流量归档、故障回溯与分析打下基础。

















