CentOS で HA Proxy を動かそうとして HA Proxy 自体のログはどこぢゃ?と思った皆さん、おはようございます。かっぱ(@inokara)です。
追記
HA Proxy の 1.5.0 が正式にリリースされましたので、引き続きの検証はこの 1.5.0 にて試したいと思います。
はじめに
- 個人的にどハマりしたのでメモです
- ついでにログフォーマットとかも調べてみたいと思います
環境
- Amazon EC2
- CentOS release 6.4 (Final)
- HA-Proxy version 1.4.24 2013/06/17
環境の構築はせっかくなので Chef Metal を利用します。Chef Metal の本来の使い方とはことなるかもしれませんが、簡単にインスタンスを起動して必要な設定まで行ってくれるのは有難いですな。
ドハマりの記録
haproxy.cfg
インストール直後の /etc/haproxy.cfg の冒頭には以下のように記載されています。
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local0
syslog が云々かんぬんと言っているようですね。でも、インストールした CentOS には syslog の影も形も見当たりません。変わりに rsyslog が導入されているので rsyslog を使ってあげる必要がありそうです。
また、この状態の場合、HA Proxy のログはどこにも出力されていない状態です。
ログ出力について
こちらには以下のように記載されています。
An IPv4 address optionally followed by a colon (‘:’) and a UDP
port. If no port is specified, 514 is used by default (the
standard syslog port).
syslog の 514 番 UDP ポートにログを投げつけるのがデフォルトのようです。ここ重要です…。
rsyslog の設定
rsyslog.conf に以下の設定を行います。
--- rsyslog.conf.original 2014-06-22 01:33:09.416130090 +0000
+++ rsyslog.conf 2014-06-22 01:33:23.723130740 +0000
@@ -10,8 +10,8 @@
#$ModLoad immark # provides --MARK-- message capability
# Provides UDP syslog reception
-#$ModLoad imudp
-#$UDPServerRun 514
+$ModLoad imudp
+$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
修正後 rsyslog を再起動します。
/etc/init.d/rsyslog restart
さらに haproxy も再起動しましょう。
/etc/init.d/haproxy restart
以下のように /var/log/messages 内にログ出力されるようになります。
ひとまず haproxy のログが出力されるようになりました。
別のファイルに書き出したい
/var/log/messages に出力させているとカーネルのログ等と混じってしまうのでファシリティを指定してログ出力を分けたいと思います。
/etc/rsyslog.d/haproxy.conf
既に以下のように設定されています。
$IncludeConfig /etc/rsyslog.d/*.conf
ということでアプリケーション毎の固有の設定を /etc/rsyslog.d/ 以下に置けるように /etc/rsyslog.d を作成しておきます。
mkdir /etc/rsyslog.d
作成したら /etc/rsyslog.d/haproxy.conf を以下のように作成します。
$ModLoad imudp
$UDPServerRun 514
$template Haproxy,"%msg%n"
local0.=info -/var/log/haproxy/haproxy.log;Haproxy
local0.notice -/var/log/haproxy/admin.log;Haproxy
# don't log anywhere else
local0.* ~
rsyslog と haproxy の再起動
rsyslog を再起動します。
/etc/init.d/rsyslog restart
念のため…haproxy を再起動します。
/etc/init.d/haproxy restart
再起動を実行すると /var/log/haproxy/admin.log に以下のようなログが出力されました。
また、/var/log/haproxy/haproxy.log には以下のようなログが出力されました。
ログのフォーマットについての確認
HA Proxy のログフォーマットについて
ドキュメントを見る限りではかなり細かい設定が出来るようです。
また、フォーマットに関してはこちらにあるように下記のフォーマットがあります。
それぞれ細かい設定が出来るようなので取得出来る範囲でフォーマット毎の出力をちょっと見てみたいと思います。尚、ログのフォーマットを見る環境は以下のような構成です。
一台の HA Proxy ホストのバックエンドで 2 台の Web アプリケーションサーバーが稼働している状態です。
Default format
以下のように設定します。
mode http
log global
ログの出力は下記の通りです。
マスクがし過ぎてなんのこっちゃ解らないかもしれませんが、以下のようなシンプルなログ出力となります。詳細はフィールドはこちらをご確認下さい。
TCP format
以下のように設定します。
mode http
option tcplog
log global
ログの出力は下記の通りです。
フォーマットの詳細はこちらをご確認下さい。
HTTP format
以下のように設定します。
mode http
option httplog
log global
ログの出力は下記の通りです。
HTTP のステータスコードやパス等の Web サーバーが出力する一般的なログが出力されるようになります。尚、詳細なフォーマットについてはこちらをご確認下さい。
CLF HTTP format
CLF とは Common Log Format の略です。汎用的な Web サーバーのフォーマット(完全意訳)で複数の Web サーバーでサポートしています。指定は以下のように設定します。
mode http
option httplog clf
log global
ログは以下の様な出力が得られます。
また、比較としてバックエンドの Web サーバー(Apache)のログ出力も掲載します。
後半部分の数字の羅列以外はよく似たフォーマットであることがわかります。
まとめ
戒め
- ちゃんとドキュメントを読みましょう
HA Proxy のドキュメント
- ボリュームありますね…
ログ出力に関するポイントとしては…
- 現状では rsyslog を使いましょう
- 出し分けはファシリティを指定しましょう
- フォーマットはお好みで…
元記事は、こちら