Last Updated on 2021年7月4日 by かんりにん
※haproxy RPM版です。
Contents
haproxyのログをrsyslogへ出力する場合の設定方法。
ログの書き出しはsyslogファシリティを利用するが、送信方法はrsyslogの環境に応じた、下記の2通り。
- UDPで送る(syslogファシリティ)
haproxyのログ出力の設定は、デフォルトでsyslog/rsyslog側でUDP514番ポートを有効にし、そこへhaproxyのログを投げるように書かれている。
ログをローカル以外に送信したい場合、ローカルも含めて複数のホストに残したい場合はこちら。 - rsyslog側でソケットを用意してあげる場合
rsyslog側でソケットとフィルタリングルールを設定し、haproxy側でソケットを指定してログを送信する。
ロードバランサーのローカル内にログをすべて落とす場合はこちらでオッケー。
1)UDPで送る場合(syslogファシリティ使用)
haproxyはデフォルトでsyslogファシリティを使う指定が有効になっているので、rsyslog側を合わせればすぐ使用可能。
参考:お世話になっております!
How to enable logging of haproxy in rsyslog
HAProxy: Give me some logs on CentOS 6.5!
HAProxy Logging
※地味にulimitの設定やmaxconnの設定も参考になる。
rsyslog&syslog
1-1. haproxy側の設定
こちらはhaproxy.cfg内にて以下の記述が有効になっていればOK。
log 127.0.0.1 local2
デフォルトでsyslogファシリティの指定がlocal2で設定されている。
コメントアウトされていない場合は有効化。ファシリティはlocal2が埋まっている場合は変更してもOK。
1-2. rsyslog側の設定
1.UDP514番ポートでの待ち受けを有効に。
パターン1. /etc/rsyslog.confでの設定
$ModLoad imudp $UDPServerRun 514 $UDPServerAddress 127.0.0.1
こちらの場合は、UDPServerAddressで127.0.0.1を指定しているので、UDPでのログ受信は有効ながら、ローカルホストからの受信だけが有効。
パターン2. /etc/sysconfig/rsyslogで設定する場合(RedHat、CentOS)
上記のrsyslog.confの代わりにこちらで設定を行う場合。
SYSLOGD_OPTIONS="-m 0 -r514"
ただし、こちらの場合は待ち受けIPが0.0.0.0になる、という違いがある。
LAN内の各ホストからsyslogを受け付けるサーバーであれば問題なし。
上記設定後、netstatで確認すると”0.0.0.0″で待ち受けされている。
udp 0 0 0.0.0.0:514 0.0.0.0:*
2.syslogファシリティをhaproxyのログ出力用に指定。
haproxy.cfgでデフォルト指定されているlocal2を使用。haproxy.cfg側でファシリティを変更した場合はそちらに合わせる。
local2.* /var/log/haproxy.log
3./var/log/messagesへの出力を抑制
syslogファシリティを設定した場合、そのままだと/var/log/messagesにも出力されるので二重にログが出力されてしまう状況に。
ファシリティの番号を指定して、出力を抑制する設定を追加。
具体的には指定したログファシリティに”.none”をつければOK。
– 変更前
*.info;mail.none;authpriv.none;cron.none /var/log/messages
– 変更後
*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages
1-3. 設定適用
syslogファシリティ設定後、rsyslogd、haproxyの順番で再起動し、ログ出力を確認。
1. rsyslogd再起動
# /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ] #
2. ポート確認
UDP514番でのポート起動を確認。
# netstat -ln | grep 514 udp 0 0 127.0.0.1:514 0.0.0.0:*
3. haproxy再起動
# /etc/init.d/haproxy restart Stopping haproxy: [ OK ] Starting haproxy: [ OK ] Message from syslogd@localhost at Apr 27 12:32:49 ...
4. ログ確認
ちょっと古いけど、04/27の作業ログです。
Apr 27 12:32:49 localhost haproxy[1579]: Proxy main started. Apr 27 12:32:49 localhost haproxy[1579]: Proxy static started. Apr 27 12:32:49 localhost haproxy[1579]: Proxy app started.
出力されました。
2)syslogのソケットを使ってログを送る場合
上記1のsyslogファシリティでの設定と異なり、rsyslog.conf側でソケットを指定し、haproxy側が合わせるので
先にrsyslog.confを設定し、有効化しておくと良い。
参考:お世話になってます!
haproxy logging to syslog
RSYSLOG Doc: Filter Conditions
rsyslog 特定のログに対するフィルタ
rsyslogを設定する
2-1. haproxy側設定
rsyslogで使用するソケットは、/var/lib/haproxy/以下にてディレクトリとソケットファイルを指定し、そこにhaproxyがログを送る形となる。
順番が逆になるけど、まずhaproxy.cfg空設定を。
ソケットのパス: /var/lib/haproxy/dev/log
haproxyに記述する際は、/var/lib/haproxyを省略した形で記述。
log /dev/log local0
rsyslog.conf側でフィルタを設定しているので、syslogファシリティは使う必要が無いのでlocal0でOK。
2-2. rsyslog側設定
1. AddUnixListenSocketにて、待ち受けソケットを指定する。
rsyslog.conf内に”$ActionFileDefaultTemplate”で”RSYSLOG_TraditionalFileFormat”の設定があれば
その下に記載すると、syslogのフォーマットがデフォルトになる
以下では、/var/lib/haproxy以下にソケット用ディレクトリ”dev”をmkdirし、ソケット”log”を設定。
$AddUnixListenSocket /var/lib/haproxy/dev/log
※/var/lib/haproxy以下に直接ソケットを指定すると、haproxy側の設定でエラーが出るのでディレクトリを1段下に指定する。
※ソケットの出力先ディレクトリはhaproxyユーザーのホームディレクトリからの相対パスとなる。
2. ログのフィルタリング
ログ内の”haproxy”エントリは/var/log/haproxy.logに出力。
プロパティベースでの書式例
:programname, startswith, "haproxy" /var/log/haproxy.log &~
if文の条件式ベースの場合(こちらのほうが柔軟にできるかも?)
if $programname startswith 'haproxy' then /var/log/haproxy.log &~
→設定後、rsyslogd再起動(reloadではダメ、再起動をすること)。
2-3. 設定適用
こちらもsyslogファシリティ設定時と同様、rsyslogd、haproxyの順番で再起動し、ログ出力を確認。
1. rsyslogd再起動
# /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ] #
3. haproxy再起動
# /etc/init.d/haproxy restart Stopping haproxy: [ OK ] Starting haproxy: [ OK ]
参考:ログ出力の抜粋
そのほか、haproxyで出力されるログの表示をサンプルとして記載。
バックエンドサーバー起動時のログ
バックエンドサーバーで指定したサービスが起動し、HAProxy側からアクティブとして認識された際のログ
Apr 27 12:36:21 localhost haproxy[1580]: Server static/dev-web02 is UP, reason: Layer4 check passed, check duration: 0ms. 1 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
サーバー停止時のログ
今度はバックエンドサーバーでサービスが停止し、HAProxy側からステータスDOWNとして認識された際のログ。
そのままバックエンドサーバーから除外され、リクエストは転送されなくなる。
Apr 27 12:37:01 localhost haproxy[1580]: Server static/dev-web02 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.
さらに、バックエンドサーバーが1台もいなくなった時の警告ログ
これは、バックエンドを構成しているサーバーの最後の1ホストが応答しなくなった時の通知。
Message from syslogd@localhost at Apr 27 12:37:01 ... haproxy[1580]: backend static has no server available! Apr 27 12:37:01 localhost haproxy[1580]: backend static has no server available!
ちなみに、バックエンド側にもログが飛ばされてくる。
Message from syslogd@localhost at Apr 27 12:37:01 ... haproxy[1580]: backend static has no server available!
クライアントアクセス時のログ
これはサービスインした状態でのHAProxyへのアクセスログ。どのバックエンドサーバーへ転送されたかも出力される。
haproxy.log
Apr 27 12:40:00 localhost haproxy[1580]: 198.51.100.216:51524 [27/Apr/2015:12:40:00.028] main static/dev-web02 963/0/1/2/966 200 296 - - ---- 3/3/0/1/0 0/0 "GET / HTTP/1.1" Apr 27 12:40:01 localhost haproxy[1580]: 198.51.100.216:51524 [27/Apr/2015:12:40:00.994] main static/dev-web02 313/0/0/2/315 404 467 - - ---- 3/3/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"
バックエンドサーバーのaccess_log
198.51.100.216 - - [27/Apr/2015:03:40:00 +0000] "GET / HTTP/1.1" 200 29 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.37 Safari/537.36" 198.51.100.216 - - [27/Apr/2015:03:40:01 +0000] "GET /favicon.ico HTTP/1.1" 404 287 "http://203.0.113.128/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.37 Safari/537.36"
といったところで。