okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

FluetndでApacheのアクセスログを集約する

こんにちは@oko_changです。
すでに色々な方がまとめていますが、やっぱり自分なりにブログにまとめたほうが覚えやすいので今回はfluentdについて書きます。

Fluentdとは?

こちらを見るのがやはり早いですかね。

環境

どちらもCentOS 6.5を使用しています。
今回はFluentdを使ってローカルのファイルに保存しつつ、転送先にも保存するまで確認します。
f:id:okochang:20140320100028p:plain

転送元環境

インストール前

Fluentdについては色々な方がブログとかでもまとめているので、そちらを参考になりますが、公式ドキュメントもとても充実していました。
ここにFluentdをインストール前にするべき事が記載されていますので、設定します。
※limits.confとsysctl.confにそれぞれ追記する

# vi /etc/security/limits.conf
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536

# vi /etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240    65535

# reboot

Apacheの設定

今回はテスト用のログファイルとしてApacheアクセスログを使用します。
テスト環境のアクセスログのフォーマットは以下のように変更してあります。
また、td-agent(Fluentd安定版の配布パッケージ )にアクセス出来るようにログディレクトリの権限を修正します。

# grep "custom" /etc/httpd/conf/httpd.conf 
LogFormat "%{%Y-%m-%d %T %Z}t %D %a %u [%r] %s %b [%{Referer}i] [%{User-Agent}i]" custom
CustomLog logs/access_log custom
# chmod 755 /var/log/httpd

td-agentのインストール、設定

次にtd-agentをインストールします。
公式ドキュメントに記載してあるようにインストールスクリプトを使って簡単に導入が可能です。

# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh

設定方法も公式ドキュメントのconfig-fileinput-pluginoutput-pluginをひと通り読むと分かりやすかったです。
Apacheデフォルトのログ形式であればテンプレートがあるみたいですが、今回は少しカスタマイズしているため、正規表現のチェックをこちらでやりました。
また、自分のローカルと別のFluetndサーバに転送するため、以下のような設定をしています。

# vi /etc/td-agent/td-agent.conf
## Input
<source>
  type tail
  path /var/log/httpd/access_log 
  format /^(?<date>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \w{3}) (?<processing_time>[^ ]*) (?<remote>[^ ]*) (?<user>[^ ]*) \[(?<method>.*)\] (?<status>[^ ]*) (?<size>[^ ]*) \[(?<referer>[^ ]*)\] \[(?<agent>.*)\]/
  pos_file /var/log/td-agent/tmp/apache.access.log.pos
  tag apache.access
</source>

## Output
<match apache.access>
  type copy
  <store>
    type file
    path /var/log/td-agent/apache.access
    time_slice_format %Y%m%d
    time_format %Y%m%dT%H%M%S%z 
  </store>
  <store>
    type forward
    send_timeout 60s
    recover_wait 10s
    heartbeat_interval 1s
    <server>
      name fluentd.okochang.com
      host 10.0.1.200
      port 24224
    </server>
  </store>
</match>

上記で設定したディレクトリなどを作成して、自動起動の設定をしたらデーモンを起動します。

# mkdir /var/log/td-agent/tmp
# chown td-agent.td-agent /var/log/td-agent/tmp
# chkconfig td-agent on
# service td-agent start

転送先環境

転送元環境と同じようにインストール前の作業をしたら、td-agentを同じくインストールします。
td-agent.confは以下のように設定しました。

# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
# vi /etc/td-agent/td-agent.conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<match apache.access>
  type file
  path /var/log/fluentd/all_access.log
  time_slice_format %Y%m%d
  time_format %Y%m%dT%H%M%S%z
</match>

さらに必要なディレクトリを作成し、自動起動の設定をしたら起動します。

# mkdir /var/log/fluentd
# chown td-agent.td-agent /var/log/fluentd/
# chkconfig td-agent on
# service td-agent start

動作確認

以下のようにログが出力されました。

転送元のログファイル

# tail -f /var/log/td-agent/apache.access.20140317.b4f4bb855c8fbaa5a 
20140317T094432+0900	apache.access	{"date":"2014-03-17 09:44:32 JST","processing_time":"372","remote":"202.215.74.59","user":"-","method":"GET / HTTP/1.1","status":"304","size":"-","referer":"-","agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:27.0) Gecko/20100101 Firefox/27.0"}

転送先のログファイル

# tail -f /var/log/fluentd/all_access.log.20140317.b4f4bb675d4776d09
20140317T094432+0900	apache.access	{"date":"2014-03-17 09:44:32 JST","processing_time":"372","remote":"202.215.74.59","user":"-","method":"GET / HTTP/1.1","status":"304","size":"-","referer":"-","agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:27.0) Gecko/20100101 Firefox/27.0"}

まとめ

fluetndは色々な方がブログにそれちらも参考になるけど、やっぱり公式のドキュメント読むとさらに理解が深まりますね。