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
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。
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" # 手动发一条 local0 日志
tail /var/log/haproxy.log
常见问题(FAQ)
Q:SELinux 环境还要注意什么? 需允许 haproxy 连 syslog 端口:setsebool -P haproxy_connect_any 1 或配对应策略。
Q:日志只在压测时才丢? UDP 丢包——换 TCP 或调大 rsyslog 队列。