今回は 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 で飛ばす設定さえできれば、後の設定は使いまわすことができるので覚えておきたいテクニックだ。