HAProxy 支持记录到文件吗?

HAProxy 支持记录到文件吗?

我刚刚安装了哈代理在我的测试服务器上。

有没有办法让它将日志写入本地文件,而不是系统日志?

这仅用于测试,因此我不想开始打开端口/用所有测试数据弄乱系统日志。

不幸的是,我能找到的唯一信息都是围绕记录到系统日志服务器的。

我尝试使用:

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支持登录到stdoutstderr

考虑到这一点,将其通过管道传输到文件就非常简单了。

# 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

最后,我特此指出,如果启用了安全增强功能,您可能需要调整日志文件上下文及其父目录。

祝你好运 :)。

扎卡里亚。

相关内容