読者です 読者をやめる 読者になる 読者になる

/home/by-natures/dev*

ソフトウェア開発者として働く人の技術的なメモ

Apache ログを転送するための fluentd 初期設定

概要

このエントリーは、さくらインターネットVPS 上の WEB サーバと、Amazon EC2 インスタンス間を fluentd で繋いだときの、さくらVPS 側の設定メモです。

そもそもは MongoDB を個人学習のために使ってみようと思い立ったのですが、さくらVPS 上に MongoDB を立てると残容量が厳しそうだったので、AWS 上に fluentd + MongoDB 環境を構築しました。この辺りの設定をまとめて1つのエントリーにしたかったのですが、ちょっと長くなりそうだったので、ログを解析して AWS 上の fluentd に送る、いわゆる "foward 用の fluentd" の部分だけをまとめました。

MongoDB 2.4 系以降は V8 を標準 JavaScript として利用しており、MapReduce プログラムをマルチスレッドで処理をしてくれるので、MapReduce フレームワークの旨みを引き出せるようになりました(参考:MongoDB 公式ドキュメント)。2.4 系以前はシングルスレッドで動作していたので、単に処理が書きやすいというだけでしたが…。 面白いデータが手に入るか、単純な Apache のログでもデータ量が溜まってきたら、MongoDB の MapReduce で少し遊んでみる予定です。

fluentd の設定自体は非常に簡単なので、本エントリーは fluentd のインストール方法の参考としてもご覧頂ければと思います。

手順

fluentd のインストール

fluentd もとい、td-agent をインストールします。td-agent は、Treasure Data 社から配付されている、fluentd の安定版です。インストールも Treasure Data 社のリポジトリを利用します:

# vim /etc/yum.repo.d/treasuredata.repo  #(以下の内容を保存)
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
enabled=0
# yum install -y td-agent --enablerepo=treasuredata
# chkconfig td-agent on

fluentd の設定ファイルの編集

次に、fluentd の設定を行います。source で Apache のログを収集する方法について設定し、match で外部サーバへ送信する設定を行っています。

今回はブログのそれぞれのエントリーへのアクセスに対象を絞るため、アクセス先のURL(path)に具体的なディレクトリ名を含んだ正規表現を記載しています。


  type tail
  format /^(?[^ ]*) [^ ]* (?:[^ ]*) \[(?
source 部について

私のWEBサーバで出力しているログは、Apache の combined log なので、format ディレクティブには combined log 用の正規表現を記述しています。上手く正規表現にマッチしなかったり、Nginx を利用している場合は「nginx のログを fluentd で扱う方法」も合わせてご覧ください。

source 部については、「接続元IP(host)」、「アクセス時間(time)」、「アクセス先のURL(path)」、「ステータスコード(code)」、「リファラ(referer)」の5つを後方参照で取得しています。fluentd は、この5つ組を1つの JSON オブジェクトとして出力します。なお、path パラメータで取得している「アクセス先のURL」は、本ブログの各エントリへの直接アクセスに絞っています。path パラメータで設定している正規表現に見合わない場合、fluentd は集計対象外のログとして、該当行を無視します。

format を自ら設定した場合には、必ず time_format ディレクティブが必要です。普段 format の指定に apache を指定している場合には、fluentd が気を利かせて time_format を暗黙的に設定してくれるので、注意が必要です。

match 部について

match 部では、外部サーバへ JSON オブジェクトを転送する設定を行っています。send_timeout, recover_wait, heartbeat_interval などの設定値がありますが、詳細は公式ドキュメント forward Output Plugin をご覧ください。

fluentd が動くか試してみる

source 部の確認

source 部の設定を確かめるには、match 部を標準出力にしてみると手っ取り早いです。同じタグだと上の match 部が適用されるようなので注意してください。


  type tail
  format /^(?[^ ]*) [^ ]* (?:[^ ]*) \[(?

この設定の上で、fluentd をデーモンとしてではなく、コンソールから直接実行します:

# td-agent -vv

この間に対象WEBサイトにブラウザからアクセスしてみてください。format の正規表現に見合わないログが書き込まれた場合は "pattern not match" と出力され、成功すれば標準出力に tag と JSON オブジェクトが出力されます。今回の場合であれば、以下のような出力がされます:

2013-06-02 03:19:41 +0900: fluent/parser.rb:38:call: pattern not match: 127.0.0.1 - - [02/Jun/2013:03:19:01 +0900] "POST /wordpress/wp-cron.php?doing_wp_cron=1370110741.6124439239501953125000 HTTP/1.0" 200 - "-" "WordPress/3.5.1; http://bynatures.net/wordpress"
2013-06-02 03:19:24 +0900 apache.access: {"host":"66.249.74.11","path":"/wordpress/1814/","code":"200","referer":"-"}
match 部(forward)の確認

転送先のサーバでも fluentd の設定が完了していれば、以上で JSON オブジェクトを転送することが出来ます。

fluentd ではポート 24224 を利用します。TCP だけでなく UDP も利用するので、FW や AWS の Security Group の設定をする際は気を付けてください。