HAProxy のログのメモ

CentOS 7 の yum でさくっとインストールできるバージョンで試しています。

  • haproxy-1.5.14-3.el7.x86_64

ログの宛先の設定

chroot しない場合

chroot しない場合は /dev/log を指定すれば簡単でした。

/etc/haproxy/haproxy.cfg

global
    log /dev/log local2
    #chroot /var/lib/haproxy
    :

chroot する場合で UDP を使う

chroot すると /dev/log が haproxy から見えなくなってしまいます。ので、UDP にします。

CentOS 7 の rsyslog はデフォだと UDP でリッスンしていないので、下記のように設定を変更して UDP を有効にします。

/etc/rsyslog.d/udp.conf

$ModLoad imudp
$UDPServerRun 514

haproxy.cfg でログの宛先に 127.0.0.1 を指定するのですが、このとき log-send-hostname も指定しなければログのホスト名が localhost になってしまったので、これも一緒に指定します。

/etc/haproxy/haproxy.cfg

global
    log 127.0.0.1 local2
    log-send-hostname
    chroot /var/lib/haproxy
    :

chroot する先に /dev/log を mount する

chroot した先で /dev/log が見えればいいので・・うーん、mount --bind で作っておく?

sudo mkdir -p /var/lib/haproxy/dev/
sudo touch /var/lib/haproxy/dev/log
sudo mount --bind /dev/log /var/lib/haproxy/dev/log

/etc/haproxy/haproxy.cfg

global
    log /dev/log local2
    chroot /var/lib/haproxy
    :

うーん、これはちょっと無いかな・・

chroot する先に rsyslog にリッスンさせる

chroot する先で rsyslog がリッスンするように設定します。

/etc/rsyslog.d/haproxy.conf

$AddUnixListenSocket /var/lib/haproxy/dev/log

ディレクトリを作成します。あと、↑で mount --bind したままなら解除しておきます。

sudo umount /var/lib/haproxy/dev/log
sudo rm -f /var/lib/haproxy/dev/log
sudo mkdir -p /var/lib/haproxy/dev/

/etc/haproxy/haproxy.cfg

global
    log /dev/log local2
    chroot /var/lib/haproxy
    :

ログを別ファイルに出力

↑の設定をしただけだとログが /var/log/messages に出てしまうので、rsyslog で別ファイルに書かれるように設定します。

/etc/rsyslog.d/haproxy.conf

:programname, isequal, "haproxy" /var/log/haproxy.log
& stop

haproxy をインストールしたときに下記のようなログローテートも設定されていたので /var/log/haproxy.log に出力しておけばローテートも行われます。

/etc/logrotate.d/haproxy

/var/log/haproxy.log {
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript

systemd のユニットファイルに書かれている /usr/sbin/haproxy-systemd-wrapper からもログが出力されるようなのですが、↑の設定だとそのログは /var/log/messages に書かれるままです。

haproxy-systemd-wrapper というタグで出力されるので、下記のようにすればそのログも /var/log/haproxy.log に出力されます。

/etc/rsyslog.d/haproxy.conf

:programname, isequal, "haproxy" /var/log/haproxy.log
& stop
:programname, isequal, "haproxy-systemd-wrapper" /var/log/haproxy.log
& stop

もしくは、startswith でも良いと思います。

:programname, startswith, "haproxy" /var/log/haproxy.log
& stop

さいごに

うーん、どの方法が良いのだろうか。。ググった感じでは UDP にしているのが多いっぽいけど。