我正在尝试拆分我的 HAProxy (v1.6.12) 日志,以便一个文件仅包含 HTTP 请求日志,而另一个文件仅包含启动/停止/等日志。我的配置中有以下内容:
global
log 127.0.0.1 local2 notice
log 127.0.0.1 local3 info info
正如你所见,我试图local3
限制仅有的信息日志,而local2
通知级别及以上则获取日志。
local2
正确地只接收通知级别及以上的日志。但是,local3
仍然会获取所有以通知级别记录的启动/停止日志。所以这告诉我,我可能错误地使用了最小日志级别?还是有错误?
谢谢!
答案1
我花了一段时间才自己弄明白,但看起来答案是通过修改日志格式和 rsyslog 设置,因为 haproxy 不提供任何“访问日志”级别。
下面是我所做操作的一个例子:
global
log 127.0.0.1:514 len 65535 local0 info
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
frontend http-in
bind *:443 ssl crt /usr/local/ssl/haproxy.pem
default_backend response-ok
option http-buffer-request
declare capture request len 2000000000
http-request capture req.body id 0
log-format "[http-request]: %ci,%[capture.req.hdr(0)]"
backend response-ok
errorfile 503 /etc/haproxy/errors/200.http
现在下一步是将 rsyslog 更改为将所有以“[http-request]”开头的日志写入不同的文件,因此我像这样编辑了 /etc/rsyslog.d/49-haproxy.conf:
# Collect log with UDP
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514
# We add :2: to remove leading whitespace
$template access_logs_form, "%msg:2:$:%\n"
# Send HAProxy access logs
:msg, contains, "[http-request]:" {
/var/log/haproxy/haproxy-traffic.log;access_logs_form
stop
}
# Send HAProxy messages to a dedicated logfile
:programname, startswith, "haproxy" {
/var/log/haproxy/haproxy.log
stop
}