ltsvを利用してtreasure-dataをもっと便利に!


はじめltsvってapacheのモジュールかと思ってましたら・・そうじゃなくって、単純にLogFormatをそのような形式にするってだけなんですね。^^; なので形式とか表示順とかは気にしなくて良いのです。
やってみてわかりましたが、ltsvってとっても便利!特に、td-agentの設定が楽になって更にうれしい感じです!今回は、いかに、ltsvが扱いやすくって、それを使ったTreasure Dataもいかに柔軟に活用できるかなんてのを説明したいと思います。(利点を充分に伝えきれない自信あり!)

tre

ltsvを利用するにあたってapache httpd.confに以下の通り設定されているか確認してください。yumでインストールとかした場合は、基本的に入っているので、あまりきにしなくて良いかもしれません。

/etc/httpd/conf/httpd.conf

LoadModule log_config_module modules/mod_log_config.so

log_config_moduleのカスタム変数については、こちらを参照してください。
http://httpd.apache.org/docs/current/mod/mod_log_config.html

でも、個人的にやってほいたほうが良さそうなのが、

・time列を、行の先頭にもってくる

という部分だけです。(後のtreasure-dataに関係してきます)

というわけでこんなltsvログフォーマットを作成してみました。ltvsのフォーマットは、

[ラベル名]:[変数名]<TAB>

という形式で書きます。
そしてTABは、\t になります。ログフォーマット(テンプレート名)名は、”apache_ltsv”としました。

以下のように作成してみました。

・ httpd.conf 

LogFormat "time:%{%d/%b/%Y:%H:%M:%S %z}t\tx_forwarded_for:%{X-Forwarded-For}i\tremote_host:%h\trequest:%r\tlast_status:%>s\tsize:%b\treferer:%{Referer}i\tuser_agent:%{User-Agent}i\tv_host:%{Host}i" apache_ltsv

ちょっと見づらいですかね?^^; タブで改行してみました。すこし見やすくなったかな? ※http.confの設定上は、改行なしで記載してください

LogFormat
"time:%{%d/%b/%Y:%H:%M:%S %z}t\t
x_forwarded_for:%{X-Forwarded-For}i\t
remote_host:%h\t
request:%r\t
last_status:%>s\t
size:%b\t
referer:%{Referer}i\t
user_agent:%{User-Agent}i\t
v_host:%{Host}i" apache_ltsv

併せて、logの出力設定に以下の項目を追記します。二行目の、CustomLog logs/access_log_ltsv apache_ltsv が今回新規に追加した分になります。

#
# For a single logfile with access, agent, and referer information
# (Combined Logfile Format), use the following directive:
#
CustomLog logs/access_log combined
CustomLog logs/access_log_ltsv apache_ltsv

・httpd.confの設定が終わりましたら。apacheを再起動します

# /etc/init.d/httpd restart

・ログが出力されているか確認します

# head /var/log/httpd/access_log_ltsv
time:[22/Jul/2013:16:40:33 +0900] x_forwarded_for:- remote_host:66.249.XXX.YYY request:GET /wordpress/?p=1548 HTTP/1.1 last_status:200 size:42160 referer:- user_agent:Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html) v_host:www.s-quad.com
time:[22/Jul/2013:16:40:36 +0900] x_forwarded_for:- remote_host:202.XXX.XXX.YYY request:GET /wordpress/wp-content/uploads/2011/07/2011-07-01_213004.jpg HTTP/1.0 last_status:200 size:87346 referer:http://www.s-quad.com/wordpress/?p=987 user_agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) v_host:www.s-quad.com
time:[22/Jul/2013:16:40:36 +0900] x_forwarded_for:- remote_host:202.XXX.XXX.YYY request:GET /favicon.ico HTTP/1.0 last_status:404 size:289 referer:- user_agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E) v_host:www.s-quad.com

tab区切りになっていて、且つ、設定したラベルが表示されているのが確認できるかと思います。わかりやすいですね。

どんな時に、ltsvが便利なのかをまとめますと。

タブ区切りの為、shell (ワンライナーで加工しやすい)

例えば、accessログのウチもっとも、アクセス回数の多いリモートホストを降順に表示する、なんていった場合は、こんな感じで書きます。
・ cut/sort/uniq を利用して回数を表示する

# cut -f3 /var/log/httpd/access_log_ltsv | sort | uniq -c | sort -r
35 remote_host:163.XXX.17.43
20 remote_host:202.XXX.2.102
16 remote_host:XXX.19.58.156
16 remote_host:XXX.179.35.3
15 remote_host:XXX.101.164.209
15 remote_host:XXX.160.194.73
14 remote_host:XXX.118.185.164
14 remote_host:XXX.232.30.232
13 remote_host:XXX.16.89.141
8 remote_host:::1
8 remote_host:XXX.138.98.193
8 remote_host:202.XXX.245.194
8 remote_host:114.180.XXX.245

もちろん、一般的なapacheのaccess_logもできないわけではないですが、正規表現とか考えると、ちょっとめんどくさいですよね。私自身覚えるのが面倒な人なんであんまし書きたくはないです。

Treasure Dataで使いやすい!

もちろん、apacheのログをTreasure Dataに格納するプラグインもあるのですが、apacheでカスタムログとか定義すると、formatとかも併せて加工する必要があるので使いづらいですよね。
ltsvであれば、ログに出力するカラムが追加されようが、順番が変更されようが、気にする必要はありません。

例として、先ほど生成した、ltsv形式のログをTreasure Dataに格納する。td-agent.confの設定例です。

あ、一点注意点としては、アクセスログディレクトリのパーミッションは必ず変更しておくこと!ですかね?^^
・パーミッションをちゃんと変更しておくこと!

# chmod o+rx /var/log/httpd

・/etc/td-agent/td-agent.conf

# cat /etc/td-agent/td-agent.conf
<source>
type tail
path /var/log/httpd/access_log_ltsv
format ltsv
time_key time
time_format %d/%b/%Y:%H:%M:%S %z
tag td.apache.access
pos_file /var/log/td-agent/apache_access.pos
</source>

<match td.apache.access>
type copy
<store>
type tdlog
apikey c77c321a5510f0fbbb294222dad62732eec2dd0d8
auto_create_table
buffer_type file
buffer_path /var/log/td-agent/buffer/td
</store>

<store>
type file
path /var/log/td-agent/access_ltsv.log
</store>
</match>

・hiveqlで、リモートホスト別アクセスランキング TOP 10を出力してみましょう!
先ほどのワンライナーで記述した方法を、hiveqlで実現してみます。実際の運用では、超ロングスパンで出力したデータを集計とかするのであれば、間違えなく、Treasure Dataを利用したほうが良いと思います。ってなわけで、簡単ではありますが、集計クエリーっぽいものを作成してみました。

・ hiveqlを利用して、リモートホスト別アクセスカウントをとる

# td query -w -d apache "SELECT v['remote_host'] as remote_addr,count(v['remote_host']) as cnt FROM access group by v['remote_host'] order by cnt desc limit 10"
MapReduce time taken: 54.736 seconds
Time taken: 54.901 seconds
Status : success
Result :
+-----------------+-----+
| remote_addr | cnt |
+-----------------+-----+
| XXX.XX.187.66 | 69 |
| 202.232.222.11 | 46 |
| 122.29.XXX.YY | 17 |
| 118.111.121.173 | 16 |
| 202.232.222.149 | 15 |
| 202.111.30.196 | 15 |
| 203.136.98.161 | 15 |
| 219.163.84.243 | 15 |
| 111.117.149.4 | 15 |
| 219.223.111.81 | 15 |
+-----------------+-----+
10 rows in set

どうでしょうか?やっぱり伝わらなかったでしょうか?(汗) 伝わらないですよね? 用途によって色々バリエーションがあると思いますので、あくまでも参考程度にってことで・・^^;

ちなみに、 トレジャーデータのインストールとか設定については、過去にここに書きました。インストールは簡単なので、ぜひおためしください。

ltsvを利用してtreasure-dataをもっと便利に!” への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です