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-log-format_01

また、この状態の場合、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 内にログ出力されるようになります。

ha-proxy-log-format_02

ひとまず 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 に以下のようなログが出力されました。

ha-proxy-log-format_03

また、/var/log/haproxy/haproxy.log には以下のようなログが出力されました。

ha-proxy-log-format_04



ログのフォーマットについての確認


HA Proxy のログフォーマットについて

ドキュメントを見る限りではかなり細かい設定が出来るようです。

また、フォーマットに関してはこちらにあるように下記のフォーマットがあります。

それぞれ細かい設定が出来るようなので取得出来る範囲でフォーマット毎の出力をちょっと見てみたいと思います。尚、ログのフォーマットを見る環境は以下のような構成です。

ha-proxy-log-format_05

一台の HA Proxy ホストのバックエンドで 2 台の Web アプリケーションサーバーが稼働している状態です。


Default format

以下のように設定します。

mode http
log global

ログの出力は下記の通りです。

ha-proxy-log-format_06

マスクがし過ぎてなんのこっちゃ解らないかもしれませんが、以下のようなシンプルなログ出力となります。詳細はフィールドはこちらをご確認下さい。


TCP format

以下のように設定します。

mode http
option tcplog
log global

ログの出力は下記の通りです。

ha-proxy-log-format_07

フォーマットの詳細はこちらをご確認下さい。


HTTP format

以下のように設定します。

mode http
option httplog
log global

ログの出力は下記の通りです。

ha-proxy-log-format_08

HTTP のステータスコードやパス等の Web サーバーが出力する一般的なログが出力されるようになります。尚、詳細なフォーマットについてはこちらをご確認下さい。


CLF HTTP format

CLF とは Common Log Format の略です。汎用的な Web サーバーのフォーマット(完全意訳)で複数の Web サーバーでサポートしています。指定は以下のように設定します。

mode http
option httplog clf
log global

ログは以下の様な出力が得られます。

ha-proxy-log-format_09

また、比較としてバックエンドの Web サーバー(Apache)のログ出力も掲載します。

ha-proxy-log-format_10

後半部分の数字の羅列以外はよく似たフォーマットであることがわかります。



まとめ


戒め

  • ちゃんとドキュメントを読みましょう


HA Proxy のドキュメント

  • ボリュームありますね…


ログ出力に関するポイントとしては…

  • 現状では rsyslog を使いましょう
  • 出し分けはファシリティを指定しましょう
  • フォーマットはお好みで…

元記事は、こちら