アクセスログをTreasure Dataに送ってみよう

SSTDの大村です。GWのど真ん中ですが、いかがお過ごしですか?後半の4日間は子供でも連れてどこかに出かけたいなと思っています。ゴリラにはまっている娘のためにゴリラがいる動物園に行こうか、息子のために遊園地に行こうか、両方は体力とお財布が。。と思案中です。結局、近所の公園でサッカーとかして終わらせたい。。。と全国の親御さんたちと同じ気持ちです。

さて、みなさんfluentdってご存知ですか?トレジャーデータ社の古橋さんが作られたOSSのログ収集ツールです。詳しくは古橋さんのブログをご覧ください。このfluentdですが、多くの方に愛されて成長し続けています。今回はfluentdでWebのアクセスログを移動し、Treasure Dataにアップロードする方法のご紹介をさせていただきます。

fluentdでアクセスログを集めよう

インストール

では、fluentdをインストールしてみましょう!といいたいところですが、前回インストールしましたTreasure Data Toolbeltに含まれていますので、あえてインストールする必要はないのです。しかし、前回の記事ではWindows版をインストールしたので、今回は下記のドキュメントを参考にlinuxOSにTreasure Data Toolbeltをインストールしてみましょう。

参照:http://help.treasure-data.com/kb/installation

今回はCentOS(環境は下記参照)を利用しましたので、そちらにTreasure Data Toolbeltをインストールします。ターミナルウィンドウで下記のコマンドを入力してください。

$ curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh

以上です。Windowsよりも簡単でしたね。

以後、fluentdではなくtd-agentという表現を使いますが、td-agentはfluentdの安定版という位置づけです。今回はtoolbeltを利用していますが、td-agentはfluentdを動作させるための動作が保障されたバージョンのRuby,jemallocが含まれている状態のfluentdです。

概要

最初にアクセスログを他のマシンへ送る設定をしてみましょう。WebサーバからTreasure Dataへ直接アクセスログを送ってもよいのですが、たくさんあるサーバからアクセスログを一箇所に集めてTreasure Dataに送るという使われ方が多いようなので今回は1台経由します。今回の構成は下図になります。

環境情報

webサーバ(アクセスログ出力側:192.168.0.10)

  • CentOS release 5.9
  • td-agent 0.10.33

Treasure Dataへアップロードするサーバ(アクセスログ受け側:192.168.0.11)

  • CentOS release 6.4
  • td-agent 0.10.33

設定

まずはWebサーバ側のアクセスログを他のPCに送信する設定をしましょう。設定をするには/etc/td-agent/td-agent.confを編集します。下記のように修正します。

次に受け側サーバの設定をします。同じく/etc/td-agent/td-agent.confを下記のように修正してください。確認しやすいようにfileにアクセスログを保存する形式にしています。

次にポートを開放します。受け側サーバ(192.168.0.11)のtcpとudpの24224を開放してください。

起動

両方のサーバでtd-agentを起動します。

$ sudo /etc/init.d/td-agent start

これで準備完了です。

アクセスログ発生

Webサーバ側でlocalhostにアクセスしてみましょう。今回はターミナルウィンドウで実行します。

$ curl http://localhost/

しばらく待って、受け側サーバの/var/log/fluent以下にファイルが作成されていれば成功です。

うまくいかない場合は各サーバの/var/log/td-agent/td-agent.logを参照してみてください。ポートが開いてない、tagのつづりが間違っているなどが原因だと考えられます。

td-agent.confの書き方を見てみよう

<source>

さて、中身を詳細に見ていきましょう。まずは<source>タグの内容です。こちらはtd-agentに入力する側の設定を書きます。こちらのドキュメントが詳しいです。

今回はapache webサーバのaccess_logファイルに追加があればその情報をtd-agentで送る処理をしています。type tailと記述します。また、type forwardと書くと他のtd-agentから送られてきたアクセスログを処理します。portには送られてくるポートを書きます。fluentdの標準ポートは24224です。

次の行のformat apacheですが、td-agentはapacheのアクセスログを自動でjson形式に変換してくれますのでapache logの場合はapacheと指定します。他の形式もありますのでこちらを参照してください。

pathは集めたいアクセスログファイルのパスになります。tagはイベントの名前になりますが、td-agentがやってきたログを振り分けるためのラベルのようなものと考えてください。今回は先のことも考えてtd.testdb.accesslogとしています。pos_fileは対象ファイルの情報をどこまで送り終わったかを記録しておくファイルです。

<match>

次は<match>タグの内容です。こちらはtd-agentから出力する側の設定を書きます。こちらのドキュメントが詳しいです。

まずmatchの横のパターンですが、先ほどsourceのほうで書いたtagと同じになります。td.*.*というイベントの場合はmatchタグの内容を実行するということになります。ワイルドカードで取得することができるので、この書き方だとtd.testdb.accesslogも含みます。詳しくはこちらをご覧ください。

次のtypeは出力先になります。今回のようにforwardとすると別のtd-agentにログを送る処理になりますし、fileと書くとfileにログを保存する処理になります。

内部にある<server>タグですが、見てのとおり、forwardするサーバの情報を記述します。

Treasure Dataにログを送る

このままだとfluentdの使い方で終わってしまうので、Treasure Data(以後TD)にログを格納してみましょう。

TDにログを送るにはアカウントのapikeyをtd-agent.confに記述する必要があります。ターミナルウィンドウでログインして下記のコマンドを実行してください。表示された文字列を利用しますのでメモしてください。

$ td apikey:show
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

そして受け側サーバの/etc/td-agent/td-agent.confを下記のように修正してください。

TDに送る場合はtypetdlogとし、先ほど取得したapikeyを記述します。また、先ほどWebサーバ側で指定したtag部分がtd.{データベース名}.{テーブル名}として利用されます。テーブルが存在しない場合はauto_create_tableの記述をしているので自動でテーブルが作成されます。

td-agentを再起動し、再度、Webサーバ側でlocalhostにアクセスしてみましょう。

(受け側)

$ sudo /etc/init.d/td-agent restart

(Webサーバ側)

$ curl http://localhost/

しばらく待ってから確認してみましょう。ターミナルウィンドウでtdコマンドで確認します。

$ td tables
+----------+------------+------+-------+--------+---------------------------+--------+
| Database | Table | Type | Count | Size | Last import| Schema |
+----------+------------+------+-------+--------+---------------------------+--------+
| testdb | accesslog | log | 1 | 0.0 GB | 2013-04-XX XX:18:11 +0900 ||
| testdb | www_access | log | 5,000 | 0.0 GB | 2013-04-XX XX:42:00 +0900 ||
+----------+------------+------+-------+--------+---------------------------+--------+

accesslogというテーブルが自動で作成され、1件データ増えているのが確認できました!!

参考ページ

td-agentをインストールして、confファイルを編集するだけでログを集めて分析するためのいろいろな処理ができて便利な世の中になったものですね。fluentdを成長させ続けている皆様に感謝しつつ、私も普及に貢献できればいいなと思っています。

執筆:大村@SSTD