CLOVER🍀

That was when it all began.

Ubuntu Linuxで、HAProxyのログ出力にrsyslogを使う

これまで何度かHAProxyを試してきたのですが、実はログ出力ができていませんでした。
今回は、HAProxyでログ出力を行ってみたいと思います。

試すにあたり、このあたりのエントリを参考に。

参考)
HAProxyを使い始めてみる

HAProxy のログのメモ - ngyukiの日記

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

option dontlognull

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は、今回はパス…。

この感じだと、慣れればログ出力設定はなんとかなりそうですね。