CUBE SUGAR CONTAINER

技術系のこと書きます。

HAProxy のログを rsyslog と logrotate でローテーションする

今回は RDB サーバや HTTP サーバを冗長化する際にロードバランサと共に用いられることが多い HAProxy のログを rsyslog と logrotate を使ってローテーションする際の設定について書く。

検証用の環境には CentOS7 を使った。

$ cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
$ uname -r
3.10.0-229.11.1.el7.x86_64

HAProxy を設定する

まずは HAProxy と rsyslog をインストールする。

$ sudo yum -y install haproxy rsyslog

今回は HAProxy を動かすこと自体が目的ではないので設定はデフォルトの状態をそのまま使う。 デフォルトではログは syslog を使って localhost に local2 ファシリティで送信される。

$ cat /etc/haproxy/haproxy.cfg | grep local2
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #    local2.*                       /var/log/haproxy.log
    log         127.0.0.1 local2

rsyslog を設定する

HAProxy の送信した syslog を受信する rsyslog 側では、local2 ファシリティのログを /var/log/haproxy/haproxy.log で保存するように設定する。

$ cat << EOF | sudo tee /etc/rsyslog.d/haproxy.conf > /dev/null
local2.* /var/log/haproxy/haproxy.log
EOF

そして、HAProxy はデフォルトでは UDP のポート 514 番に対して syslog を送信するため、それを受け取れるようにデフォルトではコメントアウトされている設定からコメントを外しておく。

$ sudo sed -i.back -e "
  s:^#\(\$ModLoad imudp\)$:\1:
  s:^#\(\$UDPServerRun 514\)$:\1:
" /etc/rsyslog.conf

logrotate を設定する

あとは rsyslog が書き込む上記のログを logrotate でローテーションできるように設定する。

$ cat << EOF | sudo tee /etc/logrotate.d/haproxy > /dev/null
/var/log/haproxy/haproxy.log {
    dateext
    hourly
    missingok
    rotate 3
    notifempty
    nocompress
    sharedscripts
    delaycompress
    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
}
EOF

動作を確認する

ここまでで準備が整ったので rsyslog を再起動した上で HAProxy のサービスを起動する。

$ sudo systemctl restart rsyslog
$ sudo systemctl start haproxy
$ sudo systemctl enable haproxy

これでログが /var/log/haproxy/haproxy.log に書き込まれる。

$ sudo cat /var/log/haproxy/haproxy.log
Aug 19 19:32:59 localhost haproxy[13347]: Proxy main started.
Aug 19 19:32:59 localhost haproxy[13347]: Proxy static started.
Aug 19 19:32:59 localhost haproxy[13347]: Proxy app started.
Aug 19 19:32:59 localhost haproxy[13347]: Server static/static is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Aug 19 19:32:59 localhost haproxy[13347]: backend static has no server available!
Aug 19 19:32:59 localhost haproxy[13347]: Server app/app1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 3 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Aug 19 19:33:00 localhost haproxy[13348]: Server app/app2 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 2 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Aug 19 19:33:00 localhost haproxy[13348]: Server app/app3 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Aug 19 19:33:01 localhost haproxy[13348]: Server app/app4 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Aug 19 19:33:01 localhost haproxy[13348]: backend app has no server available!

ローテーションの挙動を確認するため logrotate コマンドを実行する。

$ sudo logrotate -fv /etc/logrotate.d/haproxy 
reading config file /etc/logrotate.d/haproxy

Handling 1 logs

rotating pattern: /var/log/haproxy/haproxy.log  forced from command line (3 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/haproxy/haproxy.log
  log needs rotating
rotating log /var/log/haproxy/haproxy.log, log->rotateCount is 3
dateext suffix '-2015081919'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/haproxy/haproxy.log to /var/log/haproxy/haproxy.log-2015081919
running postrotate script

すると logrotate によってローテーションされたログが確認できる。

$ sudo ls /var/log/haproxy/
haproxy.log-2015081919

元の名前のファイルが見当たらないのは HAProxy からまだ新しくログが出力されていないためなので、サービスを再起動するなどすれば作成される。

$ sudo systemctl restart haproxy
$ sudo ls /var/log/haproxy/
haproxy.log  haproxy.log-2015081919

いじょう。

まとめ

今回は HAProxy のログを syslog で飛ばして、それを rsyslog と logrotate でローテーションさせる方法について扱った。 ログを syslog で飛ばす設定さえできれば、後の設定は使いまわすことができるので覚えておきたいテクニックだ。