8. 日志记录
对于日志记录,HAProxy 始终依赖 syslog 服务器,因为它不执行任何文件系统访问。标准用法是通过 UDP 将日志发送至日志服务器(默认端口为 514)。通常情况下,该配置会指向 127.0.0.1,即本地 syslog 守护进程运行的位置,但也常通过网络将日志发送至集中式服务器。在主动-主动场景中,集中式服务器尤其具有优势,可确保日志按到达顺序合并。HAProxy 也可使用 Unix 套接字将日志发送至本地 syslog 守护进程,但强烈不建议使用,因为当 syslog 服务器重启而 haproxy 仍在运行时,套接字将被替换,新日志将丢失。由于 HAProxy 将被隔离在 chroot 环境中,它将无法重新连接至新的套接字。现场观察表明,Unix 套接字使用的日志缓冲区非常小,即使在极轻负载下也可能导致消息丢失。不过,这在测试环境中可以接受。
建议将以下指令添加至 “global” 段,以使 HAProxy 使用 “local0” 设施将日志输出至本地守护进程:
然后在每个“defaults”段或每个前端和后端段中添加以下配置:
通过这种方式,所有日志将通过全局定义日志服务器位置的方式实现集中化。
某些 syslog 守护进程默认不监听 UDP 流量,因此具体启用方式取决于所使用的守护进程:
在 sysklogd 上,需在守护进程的命令行中传递参数 “-r”,使其监听用于接收“远程”日志的 UDP 套接字;请注意,无法将其限制为仅接收来自 127.0.0.1 的日志,因此也会接收来自远程系统的日志;
在 rsyslogd 中,必须将以下行添加到配置文件中:
- 在 syslog-ng 上,可通过以下方式创建新的源,随后需将其添加至某个 “log” 指令的有效源列表中:
请参阅系统日志守护进程手册以获取更多信息。如果系统日志文件中未见日志,请考虑执行以下测试:
重启 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 排序、按访问次数对客户端地址排序等。该工具可快速发现异常情况,例如机器人在网站上循环访问,便于及时阻断。