我刚刚安装了哈代理在我的测试服务器上。
有没有办法让它将日志写入本地文件,而不是系统日志?
这仅用于测试,因此我不想开始打开端口/用所有测试数据弄乱系统日志。
不幸的是,我能找到的唯一信息都是围绕记录到系统日志服务器的。
我尝试使用:
log /home/user/ha.log local0
在我的配置中。但这告诉我:
[ALERT] 039/095022 (9528) : sendto logger #1 failed: No such file or directory (errno=2)
当我重新启动时。所以我创建了文件touch /home/user/ha.log
并重新启动,此时我得到:
[ALERT] 039/095055 (9593) : sendto logger #1 failed: Connection refused (errno=111)
这是可能的,还是我必须配置系统日志等才能查看我的测试数据?
答案1
Haproxy 根本不支持记录到文件。如文档中所述(https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#3.1-log),“log”语句将地址作为第一个参数。如果这是一个文件,那么它是一个 unix 套接字,HAProxy 将以 syslog 格式与该套接字进行对话。 Haproxy 是这样设计的,因为它的职责是代理请求,而不是写入文件,它将日志文件的写入委托给 syslog。如果你不想弄乱你的机器,你可以安装logstash并运行:
logstash -e 'input { unix { path => "/tmp/haprxoy_log.sock" } } output { stdout { } }'
并添加:
log /tmp/haprxoy_log.sock
在你的haproxy.cfg中来测试它。
答案2
您可以更改下面的 haproxy 日志配置文件,/etc/rsyslog.d/
将文件指向您喜欢的路径。不确定其他发行版。对我来说,我使用的是 Debian。我改为/etc/rsyslog.d/49-haproxy.conf
指向/var/log/haproxy/haproxy.log
,
# Create an additional socket in haproxy's chroot in order to allow logging via
# /dev/log to chroot'ed HAProxy processes
$AddUnixListenSocket /var/lib/haproxy/dev/log
# Send HAProxy messages to a dedicated logfile
:programname,startswith,"haproxy" /var/log/haproxy/haproxy.log
您还应该将日志路径更新/etc/logrotate.d/haproxy
为新路径。这样它将使用 . 在新配置的路径中旋转和压缩日志文件gzip
。
然后重新启动rsyslog.service。
sudo systemctl restart rsyslog.service
现在haproxy.log.*
文件将位于/var/log/haproxy/
目录中。
答案3
自版本以来1.9 HAProxy支持登录到stdout
和stderr
。
考虑到这一点,将其通过管道传输到文件就非常简单了。
# change haproxy.cfg file with the following
global
log stdout local0 debug
defaults
log global
option httplog
然后你可以像这样简单地运行 HAProxy:
haproxy -f haproxy.cfg > haproxy.log 2>&1 &
您可能知道通过>
管道传输stdout
到文件haproxy.log
,然后也2>&1
通过管道传输stderr
到同一个文件。最后,&
该进程将置于后台。
您可以更进一步,尝试设置一个脚本来haproxy
通过执行以下操作来杀死先前的实例:
#!/bin/bash
# mini launcher
kill -9 `cat /home/user/haproxy.pid`
/home/user/haproxy -f /home/haproxy.cfg > /home/user/haproxy.log 2>&1 &
echo $! > /home/user/haproxy.pid
很难,正如你可能知道的那样......不建议。
编辑:记录到文件曾经是一个阻塞事件,因此不推荐,特别是对于像 HAProxy 这样的东西。 HAProxy 团队在上面链接的发布帖子中非常清楚地表明这是不再是这样了。
我们已经收到了很多这样的请求,并花了一些时间来规划实现它的最佳方法(无阻塞),我们很高兴地宣布我们已经找到了解决方案!
答案4
您必须创建一个日志服务,以便 haproxy 能够记录到特定文件。使用以下说明,该说明在 EL7 和 HAProxy 2.7-dev5 中对我有用:-
yum 安装 rsyslog
vi /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514
local2.* /logdir/haproxy
local3.* /logdir/haproxy-access_log
systemctl 重新启动 rsyslog && ldconfig
vi /../../haproxy.cfg
global
log stderr local0 info
log 127.0.0.1 local2 notice
log 127.0.0.1 local3
defaults
log global
option httplog
systemctl 重新启动 haproxy
不要忘记设置日志轮换服务,以避免不必要的空间消耗,并且以下应该可以完成这项工作:-
vi /etc/logrotate.d/haproxy
/logdir/logdir/haproxy-access_log {
weekly
rotate 7
missingok
size=5M
notifempty
dateext
dateformat -%d%m%Y
compress
create 0644 logfileowner logfileowner
su logfileowner logfileowner
mail email@torecievelogs
postrotate
/usr/bin/systemctl reload haproxy
endscript
}
另外,运行以下两个命令来查明日志轮换是否存在问题:-
logrotate --force /etc/logrotate.d/haproxy
grep logrotate /var/log/audit/audit.log | audit2why
最后,我特此指出,如果启用了安全增强功能,您可能需要调整日志文件上下文及其父目录。
祝你好运 :)。
扎卡里亚。