13.9.1 日志格式与配置(syslog、rsyslog、JSON)

日志格式与配置(syslog、rsyslog、JSON)#

导语#

本节围绕 HAProxy 日志到 syslog/rsyslog 的落盘流程与 JSON 结构化输出,给出可直接执行的配置、验证命令、排错方法与练习。


原理草图(日志链路)#

文章图片

安装与启用 rsyslog(示例)#

CentOS/RHEL:

# 安装与启动
yum install -y rsyslog
systemctl enable --now rsyslog

# 验证 UDP 514 监听
ss -lunp | grep 514

Ubuntu/Debian:

apt-get update
apt-get install -y rsyslog
systemctl enable --now rsyslog
ss -lunp | grep 514

命令解释:
- systemctl enable --now rsyslog:设置开机自启并立即启动
- ss -lunp:查看 UDP 监听端口与进程


syslog/rsyslog 配置(可执行示例)#

1)HAProxy 配置(/etc/haproxy/haproxy.cfg)

global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice
  maxconn 4000

defaults
  log global
  option httplog
  option dontlognull
  timeout connect 5s
  timeout client  30s
  timeout server  30s

frontend http_in
  bind *:8080
  default_backend web_pool

backend web_pool
  server s1 127.0.0.1:9001 check

2)rsyslog 接收与落盘(/etc/rsyslog.d/49-haproxy.conf)

# 启用 UDP 接收
$ModLoad imudp
$UDPServerRun 514

# 分流到独立文件
local0.* /var/log/haproxy/haproxy.log
local1.* /var/log/haproxy/haproxy-notice.log

3)重载与验证

# 语法校验
haproxy -c -f /etc/haproxy/haproxy.cfg

# 重载 HAProxy
systemctl reload haproxy

# 重启 rsyslog
systemctl restart rsyslog

# 触发请求并查看日志
curl -s http://127.0.0.1:8080/ >/dev/null
tail -n 5 /var/log/haproxy/haproxy.log

命令解释:
- haproxy -c -f:校验配置文件语法
- systemctl reload haproxy:无损重载
- tail -n:查看最新日志


JSON 结构化日志(示例与验证)#

HAProxy JSON log-format(/etc/haproxy/haproxy.cfg)

defaults
  log global
  option httplog
  log-format {"ts":"%t","src":"%ci","src_port":%cp,"dst":"%si","dst_port":%sp,"frontend":"%ft","backend":"%b","server":"%s","status":%ST,"bytes":%B,"method":"%HM","path":"%HP","http_ver":"%HV","req_time":%TR,"conn_time":%Tc,"queue_time":%Tw,"resp_time":%Tr}

验证与格式检查:

systemctl reload haproxy
curl -s http://127.0.0.1:8080/ >/dev/null
tail -n 1 /var/log/haproxy/haproxy.log | jq .

命令解释:
- jq .:检查 JSON 结构是否合法
- %TR/%Tc/%Tw/%Tr:请求与连接相关耗时字段


日志切割(logrotate 示例)#

/etc/logrotate.d/haproxy

/var/log/haproxy/*.log {
  daily
  rotate 7
  compress
  delaycompress
  missingok
  notifempty
  create 0640 syslog adm
  sharedscripts
  postrotate
    systemctl reload rsyslog
  endscript
}

常见排错与定位命令#

1)rsyslog 未接收

# 检查监听
ss -lunp | grep 514

# 检查防火墙
iptables -L -n | grep 514

2)日志不落盘

# rsyslog 规则是否生效
rsyslogd -N1

# 配置文件是否加载
grep -R "49-haproxy.conf" /etc/rsyslog.conf /etc/rsyslog.d/

3)JSON 乱码/解析失败

# 检查是否有非法字符
tail -n 1 /var/log/haproxy/haproxy.log | cat -A

# 验证 JSON 合法性
tail -n 1 /var/log/haproxy/haproxy.log | jq .

练习#

  1. local0.* 改为 local0.notice,触发请求并观察日志是否减少。
  2. 为 JSON 日志新增字段 actconnfeconn,并用 jq 验证输出。
  3. 模拟后端不可用(关闭 9001 服务),查看日志中状态码与重试信息。
  4. 设置 logrotate 为 rotate 3,手动执行 logrotate -f /etc/logrotate.d/haproxy 并观察切割效果。