HAProxy 的日志没有进 rsyslog,怎么排查?
HAProxy 无日志通常是三处断点:HAProxy 配置的 log 指令、rsyslog 未启用 UDP 514 监听、或 chroot 导致 /dev/log 不可达。本文给出完整排查链路与配置示例。
HAProxy 日志链路有三个环节:HAProxy 发往 syslog(log 指令)→ rsyslog 接收(UDP 514 或 /dev/log socket)→ 写入文件。逐段验证即可定位。
1. HAProxy 配置
global
log /dev/log local0 # 本机 syslog socket
# 或发 UDP:log 127.0.0.1:514 local0
defaults
mode http
log global
option httplog # HTTP 详细日志
2. rsyslog 接收配置
# /etc/rsyslog.conf 取消 UDP 监听注释
module(load="imudp")
input(type="imudp" port="514")
# 把 local0 设施写入独立文件
local0.* /var/log/haproxy.log
重启两边:systemctl restart rsyslog haproxy。
UDP input 只验证 UDP 路径;若 HAProxy 使用 /dev/log,需核对 imuxsock 或发行版 journald 转发。chroot 自定义 input 前确保 imuxsock 已加载,并创建相应父目录。
3. chroot 陷阱(最常见)
HAProxy 配置里 chroot /var/lib/haproxy 时,进程看到的 /dev/log 是 chroot 内的——syslog socket 不存在,日志静默丢失。解法:
- 让 rsyslog 在 chroot 里创建 socket:
input(type="imuxsock" Socket="/var/lib/haproxy/dev/log"); - 或干脆改用 UDP(
log 127.0.0.1:514 local0)绕开 socket 问题。
验证
logger -p local0.info "test" # 测试系统默认本地 socket 路径
logger --udp --server 127.0.0.1 --port 514 -p local0.info "udp test" # Linux util-linux logger
tail /var/log/haproxy.log
常见问题(FAQ)
Q:SELinux 环境还要注意什么? 检查 AVC 拒绝日志及 socket/端口标签,按实际传输配置最小授权策略;不要直接用允许任意连接的全局开关掩盖问题。
Q:日志只在压测时才丢? 检查 UDP 丢包、socket 缓冲、限速、队列与磁盘;不能仅凭压测丢日志断言 UDP,也不能不核对 HAProxy 版本/协议就直接换 TCP。HTTP 流量日志通常在事务结束时生成。