これまで何度かHAProxyを試してきたのですが、実はログ出力ができていませんでした。
今回は、HAProxyでログ出力を行ってみたいと思います。
試すにあたり、このあたりのエントリを参考に。
参考)
HAProxyを使い始めてみる
CentOS で HA Proxy のログが取れなくてドハマりした記録とログフォーマットについて
割とsyslog(というかrsyslog)を使うのが、オーソドックスな感じなのでしょうか?
これに習ってみましょう。
前提
環境は、Ubuntu Linuxにapt-getインストールしたHAProxy 1.6.3を対象とします。また、rsyslogもapt-getでインストール
するものとします。
rsyslogのインストール。
とりあえず、簡単にapt-getで。インストールしたら、rsyslogを起動しておきます。
$ sudo apt-get install rsyslog
$ sudo service rsyslog start
ところで、apt-getでHAProxyおよびrsyslogをインストールすると、/etc/rsyslog.dディレクトリ配下に、
こんなファイルができていました。
/etc/rsyslog.d/49-haproxy.conf
# Create an additional socket in haproxy's chroot in order to allow logging via # /dev/log to chroot'ed HAProxy processes $AddUnixListenSocket /var/lib/haproxy/dev/log # Send HAProxy messages to a dedicated logfile if $programname startswith 'haproxy' then /var/log/haproxy.log &~
Unixドメインソケットを使った設定っぽいですね。ここで、「/var/lib/haproxy/dev/log」ディレクトリは
というと、HAProxyのchrootした際のログ出力先です。
/etc/haproxy/haproxy.cfg
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy 〜省略〜
実は、この設定の時点で、「/var/log/haproxy.log」にHAProxyのログ出力を行うことができます。
確認
HAProxyの背後に3台のnginxを並べて、確認してみます。
「/etc/haproxy/haproxy.cfg」に、以下の設定を追加してHAProxyを再起動。
frontend nginx-http bind *:80 default_backend nginx-servers backend nginx-servers balance roundrobin mode http option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } server server1 172.17.0.2:80 server server2 172.17.0.3:80 server server3 172.17.0.4:80
すると、再起動した時点で次のようなログが出力されます。
/var/log/haproxy.log
Dec 17 14:09:49 037eaa039c2c haproxy[419]: Proxy nginx-http started. Dec 17 14:09:49 037eaa039c2c haproxy[419]: Proxy nginx-http started. Dec 17 14:09:49 037eaa039c2c haproxy[419]: Proxy nginx-servers started.
また、HAProxy越しにnginxにアクセスしてみます。
$ curl -i http://localhost/
すると、このようなログが出力されます。
Dec 17 14:10:28 037eaa039c2c haproxy[420]: 172.17.0.1:42695 [17/Dec/2016:14:10:28.938] nginx-http nginx-servers/server1 0/0/34/1/35 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" Dec 17 14:10:30 037eaa039c2c haproxy[420]: 172.17.0.1:42698 [17/Dec/2016:14:10:30.625] nginx-http nginx-servers/server2 0/0/0/0/0 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" Dec 17 14:10:31 037eaa039c2c haproxy[420]: 172.17.0.1:42701 [17/Dec/2016:14:10:31.402] nginx-http nginx-servers/server3 0/0/0/0/0 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" Dec 17 14:10:33 037eaa039c2c haproxy[420]: 172.17.0.1:42704 [17/Dec/2016:14:10:33.249] nginx-http nginx-servers/server1 0/0/0/0/0 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
ちなみに、Ubuntu Linux上にインストールしたHAProxyの、デフォルトのログ出力設定は
このようになっています。
defaults log global mode http option httplog option dontlognull
httplogが標準(?)のHTTPログ出力のようですが、
option httplog ( clf )
dontlognullは、データを送ってこないクライアントに対するログ出力を行わない設定のようです。
※ヘルスチェックなど
Disabling logging of external tests
HTTPのログ出力に関するセクションは、こちら。
HTTP log format
設定変更してみる
ちょっとログ出力の設定を変えてみましょう。
まずは、httplogの設定を次のように変更。
option httplog clf
これで、ログ出力がCommon Log Format(clf)となります。
出力例は、こんな感じ。
Dec 17 15:48:19 037eaa039c2c haproxy[441]: 172.17.0.1 - - [17/Dec/2016:15:48:19 +0000] "GET / HTTP/1.1" 200 850 "" "" 43632 468 "nginx-http" "nginx-servers" "server2" 0 0 11 1 12 ---- 1 1 0 1 0 0 0 "" "" Dec 17 15:48:19 037eaa039c2c haproxy[441]: 172.17.0.1 - - [17/Dec/2016:15:48:19 +0000] "GET / HTTP/1.1" 200 850 "" "" 43635 987 "nginx-http" "nginx-servers" "server3" 0 0 0 2 2 ---- 1 1 0 1 0 0 0 "" "" Dec 17 15:48:20 037eaa039c2c haproxy[441]: 172.17.0.1 - - [17/Dec/2016:15:48:20 +0000] "GET / HTTP/1.1" 200 850 "" "" 43638 516 "nginx-http" "nginx-servers" "server1" 0 0 0 0 0 ---- 1 1 0 1 0 0 0 "" ""
続いて、Custom Log Format。
Custom log format
Custom Log Formatを使うと、もうちょっとログフォーマットをカスタマイズできるようです。
使えるフォーマット自体は先ほどのページに記載があります。
例えば、デフォルトのhttplogと同じ内容だと、次のようなlog-formatになります。
※httplogは不要になるので、コメントアウトしました
#option httplog log-format %ci:%cp\ [%t]\ %ft\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %ST\ %B\ %CC\ %CS\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ %hr\ %hs\ %{+Q}r
やたらバックスラッシュが入っていますが、これはスペースのエスケープを意味しています。
なので、削除すると設定ファイルのパースに失敗して、エラーになります…。
ログの出力例は、こんな感じです。
Dec 17 15:57:25 037eaa039c2c haproxy[524]: 172.17.0.1:43694 [17/Dec/2016:15:57:25.270] nginx-http nginx-servers/server1 0/0/0/0/0 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" Dec 17 15:57:50 037eaa039c2c haproxy[524]: 172.17.0.1:43700 [17/Dec/2016:15:57:50.406] nginx-http nginx-servers/server2 0/0/0/0/0 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" Dec 17 15:57:52 037eaa039c2c haproxy[524]: 172.17.0.1:43703 [17/Dec/2016:15:57:52.551] nginx-http nginx-servers/server3 0/0/0/0/0 200 850 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1"
TCPは、今回はパス…。
この感じだと、慣れればログ出力設定はなんとかなりそうですね。