# 8. 日志记录

> Syslog 集成、启动日志、运行时日志及日志故障排查

---

LLMS 索引： [llms.txt](/zh/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

对于日志记录，HAProxy 始终依赖 syslog 服务器，因为它不执行任何文件系统访问。标准用法是通过 UDP 将日志发送至日志服务器（默认端口为 514）。通常情况下，该配置会指向 127.0.0.1，即本地 syslog 守护进程运行的位置，但也常通过网络将日志发送至集中式服务器。在主动-主动场景中，集中式服务器尤其具有优势，可确保日志按到达顺序合并。HAProxy 也可使用 Unix 套接字将日志发送至本地 syslog 守护进程，但强烈不建议使用，因为当 syslog 服务器重启而 haproxy 仍在运行时，套接字将被替换，新日志将丢失。由于 HAProxy 将被隔离在 chroot 环境中，它将无法重新连接至新的套接字。现场观察表明，Unix 套接字使用的日志缓冲区非常小，即使在极轻负载下也可能导致消息丢失。不过，这在测试环境中可以接受。

建议将以下指令添加至 "global" 段，以使 HAProxy 使用 "local0" 设施将日志输出至本地守护进程：

```text
log 127.0.0.1:514 local0
```

然后在每个“defaults”段或每个前端和后端段中添加以下配置：

```text
log global
```

通过这种方式，所有日志将通过全局定义日志服务器位置的方式实现集中化。

某些 syslog 守护进程默认不监听 UDP 流量，因此具体启用方式取决于所使用的守护进程：

- 在 sysklogd 上，需在守护进程的命令行中传递参数 "-r"，使其监听用于接收“远程”日志的 UDP 套接字；请注意，无法将其限制为仅接收来自 127.0.0.1 的日志，因此也会接收来自远程系统的日志；

- 在 rsyslogd 中，必须将以下行添加到配置文件中：

```shell
$ModLoad imudp
$UDPServerAddress *
$UDPServerRun 514
```

- 在 syslog-ng 上，可通过以下方式创建新的源，随后需将其添加至某个 "log" 指令的有效源列表中：

```text
source s_udp {
  udp(ip(127.0.0.1) port(514));
};
```

请参阅系统日志守护进程手册以获取更多信息。如果系统日志文件中未见日志，请考虑执行以下测试：

- 重启 HAProxy。每个前端和后端都会记录一行日志，表明其正在启动。如果收到这些日志，说明日志功能正常。

- 执行命令 `strace -tt -s100 -etrace=sendmsg -p \<haproxy's pid\>`，并执行你期望产生日志的活动。你应该能在 `sendmsg()` 调用处看到日志消息的发送。若未出现，请使用 `strace` 重新启动 HAProxy。若仍无日志输出，说明配置中肯定存在错误。

- 使用 tcpdump 监听端口 514，例如在环回接口上监听本地发送的流量："tcpdump -As0 -ni lo port 514"。如果在此处看到数据包，说明数据已发送，此时应排查 syslogd 守护进程。

流量日志由前端（接收传入连接的位置）发送，
后端也必须能够发送日志，以便在健康检查后报告服务器状态变更。
有关所有可能的日志设置的更多信息，请参阅 HAProxy 配置手册。

选择一个未被其他守护进程使用的 facility 会更加方便。HAProxy 的示例通常建议将流量日志使用 "local0"，管理日志使用 "local1"，因为它们在实际环境中几乎不会出现。使用单一 facility 也同样足够。分别记录日志便于日志分析，但同样需要注意，日志有时可能包含机密信息，因此必须避免与其他日志混合，以防意外泄露给未经授权的人员。

对于在生产环境中进行故障排查且对服务器容量影响较小的情况，建议使用 HAProxy 自带的 "halog" 工具。该工具类似于 grep，专为以极高的数据速率处理 HAProxy 日志文件而设计。典型处理速度可达每秒 1 至 2 GB 日志。它能够仅提取特定日志（例如：搜索某类 HTTP 状态码、连接终止状态、按响应时间范围搜索、仅查找错误等），统计行数，限制输出行数，还可执行一些更高级的统计分析，如按响应时间或错误计数对服务器排序、按时间或访问次数对 URL 排序、按访问次数对客户端地址排序等。该工具可快速发现异常情况，例如机器人在网站上循环访问，便于及时阻断。
