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