ラベル付きなタブ区切りファイルをfluent-plugin-tail-labeled-tsvに食わせてみる

先日↓のようなブログを書いたのですが、
RailsアプリでActiveRecordとMongoidを両方使ってみる | shinodogg.com
その中で↓のように記載させていただいたのですが、、、

なんでSquidのaccess.logにしたかっていうと、たまたま見かけた
↓のブログにグッときてしまったから、、っていう話なのですが。。
fluentdのformat(正規表現)の作り方について試行錯誤中 #fluentd – Glide Note – グライドノート

私のように、いくつになっても正規表現がちゃんと使いこなせず@tocci3に丸投げな人間にとっては、
↓のブログで紹介されている、
LTSVフォーマットなログを fluentd + GrowthForecast で料理 – naoyaのはてなダイアリー
↓こんな風なのが、

<source>
  type   tail
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/nginx/access.log
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) [(?<time>[^]]*)] "(?<method>S+)(?: +(?<path>[^ ]*) +
S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^"]*)" "(?<agent>[^"]*)" (?<response_time>[^ ]*)
 (?<upstream_response_time>[^ ]*))?$/
  tag nginx.access
  pos_file /var/log/td-agent/nginx.access.log.pos
</source>

↓こんな風になっちゃう、、なんていうのは破壊力抜群なのであります。。

<source>
  type tail_labeled_tsv
  path /var/log/nginx/access.log
  tag nginx.access
  pos_file /tmp/fluent.log.pos
</source>

今回は、このfluent-plugin-tail-labeled-tsvプラグインをインストールして、
今まで触ったことないNginx入れてログを食わせてみようかな、と。
 
 
■ fluent-plugin-tail_labeled_tsvのインストール
 
gemコマンドで入れようとしたら、、、

# gem install fluent-plugin-tail_labeled_tsv
ERROR:  Could not find a valid gem 'fluent-plugin-tail_labeled_tsv' (>= 0) in any repository

あ、↓ってLabeled Tab Separated Valueノススメ – stanakaのブログに書いてありますね。。

コードは、https://github.com/stanaka/fluent-plugin-tail-labeled-tsvにあります(近々Gem化します)。

なんとなくgemが置いてあるとこにgithubからpullしてきたソース置いたら動くかな?とか思ってやってみたけど、
んなわけないっすよね的なw
んま、ググってく過程で↓が勉強になりました。
インストール済みのgemパッケージの保存場所を調べるには – CWPStudy

# gem which rails
/var/lib/gems/1.9.1/gems/railties-3.2.9/lib/rails.rb

こんな感じで、自分のUbuntuの場合は/var/lib/gems/1.9.1/gemsの中に入ってるようです。
 
本題に戻って、ローカルでカスタムなプラグインをインストールするには、
↓によると、
fluent pluginの作成 | ksauzz weblog
・fluentd –setup /etc/fluentして
・/etc/fluent/pluginにRubyのファイルを置いてやる感じでよさそうです。
 
ということでgithubからソースコードをダウンロードしてきて、
in_tail_labeled_tsv.rbを/etc/fluent/pluginに配置します。

# mkdir fluent-plugin-tail-labeled-tsv
# cd  fluent-plugin-tail-labeled-tsv/
# git init
Initialized empty Git repository in /var/lib/gems/1.9.1/gems/fluent-plugin-tail-labeled-tsv/.git/
# git pull git@github.com:stanaka/fluent-plugin-tail-labeled-tsv.git
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 16 (delta 1), reused 16 (delta 1)
Unpacking objects: 100% (16/16), done.
From github.com:stanaka/fluent-plugin-tail-labeled-tsv
 * branch            HEAD       -> FETCH_HEAD
# mkdir -p /etc/fluent/plugin
# cp lib/fluent/plugin/in_tail_labeled_tsv.rb /etc/fluent/plugin/

↓にしてもほんの数行。こういうのをgemを使ってサクっと、とか。Fluentdナイスです。
https://github.com/stanaka/fluent-plugin-tail-labeled-tsv/blob/master/lib/fluent/plugin/in_tail_labeled_tsv.rb

 
 
■ Nginxのインストール
 
世の中、イベント駆動型でC10K問題が~とかってのが最近の流行りで、
その代表格がNginx。特に業務で使う予定も今のところないのですが、
せっかくなのでUbuntuにインストールしてみます。
インストールって言ってもapt-get install nginxするだけですが…w

# apt-get install nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
~略~
Setting up nginx-common (1.1.19-1ubuntu0.1) ...
Setting up nginx-full (1.1.19-1ubuntu0.1) ...
Setting up nginx (1.1.19-1ubuntu0.1) ...

↓に実行ファイルがあるようなので早速たたくと、、、

# which nginx
/usr/sbin/nginx

他のプロセスに80番ポート使われちゃってますから、と。

# /usr/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

nginxの設定ファイルは /etc/nginx/nginx.conf っぽいのでみてみると、

include /etc/nginx/sites-enabled/*;

だそうなので↓適当にポート番号を変更してlisten定義のコメントアウトを取り除きます。

server {
        listen   9999; ## listen for ipv4; this line is default and implied

起動してプロセスみると大丈夫っぽい。

# nginx
# echo $?
0
# ps -ef | grep nginx | grep -v grep
root     32675     1  0 12:48 ?        00:00:00 nginx: master process nginx
www-data 32676 32675  0 12:48 ?        00:00:00 nginx: worker process
www-data 32677 32675  0 12:48 ?        00:00:00 nginx: worker process
www-data 32678 32675  0 12:48 ?        00:00:00 nginx: worker process
www-data 32679 32675  0 12:48 ?        00:00:00 nginx: worker process

画面からアクセスすると、クソシンプルだぜベイベー的なw

 
ログは/var/logにあるらしいです。

# grep log nginx.conf
nginx.conf:	access_log /var/log/nginx/access.log;
nginx.conf:	error_log /var/log/nginx/error.log;

で、こいつをラベル付けたタブ区切りにしてやるってのが本日のミソ。
nginx.confにまんまコピペしちゃいますw

 29         ##
 30         # Logging Settings
 31         ##
 32
 33         log_format tsv "time:$time_localthost:$remote_addrtreq:$requesttstatus:$statustsize:$body_bytes_senttreferer:$http_re    ferertua:$http_user_agenttreqtime:$request_timetcache:$upstream_http_x_cache";
 34
 35         access_log /var/log/nginx/access.log tsv;
 36         error_log /var/log/nginx/error.log;

設定変更を反映させるにはreloadっていうのがあるらしいのだけど、
ググってくと、さすがロシア…。

んま、そんなこんなで読み込ませて、

# nginx -s reload

ログみてみると↓イイ感じ。

time:07/Feb/2013:13:22:08 +0900	host:127.0.0.1	req:GET / HTTP/1.1	status:304	size:0	referer:-	ua:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0	reqtime:0.000	cache:-
time:07/Feb/2013:13:22:39 +0900	host:127.0.0.1	req:GET / HTTP/1.1	status:304	size:0	referer:-	ua:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0	reqtime:0.000	cache:-

 
 
■ ラベル付きTSVファイルをfluent-plugin-tail-labeled-tsvに食わせてみる
Fluentdの設定ファイル

<source>
  type tail_labeled_tsv
  path /var/log/nginx/access.log
  tag hoge
  pos_file /root/hoge/fluent/acceess_log_pos_tail_labeled_tsv.log
</source>

<match hoge.**>
  type file
  path /root/hoge/fluent/hoge_tail_labeled_tsv.log
</match>

Fluentdのプロセス起動 

# fluentd -c access_log_tail_labeled_tsv.conf
2013-02-07 13:27:06 +0900: starting fluentd-0.10.29
2013-02-07 13:27:06 +0900: reading config file path="access_log_tail_labeled_tsv.conf"
2013-02-07 13:27:06 +0900: adding source type="tail_labeled_tsv"
2013-02-07 13:27:06 +0900: adding match pattern="hoge.**" type="file"
2013-02-07 13:27:06 +0900: following tail of /var/log/nginx/access.log

ナイスなJSON形式になりましたーヽ(´▽`)ノ

# cat hoge_tail_labeled_tsv.log.20130207.b4d519eb2c144ca90
2013-02-07T13:27:11+09:00	hoge	{"time":"07/Feb/2013:13:27:11 +0900","host":"127.0.0.1","req":"GET / HTTP/1.1","status":"304","size":"0","referer":"-","ua":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0","reqtime":"0.000","cache":"-"}
2013-02-07T13:27:11+09:00	hoge	{"time":"07/Feb/2013:13:27:11 +0900","host":"127.0.0.1","req":"GET / HTTP/1.1","status":"304","size":"0","referer":"-","ua":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0","reqtime":"0.000","cache":"-"}
2013-02-07T13:27:11+09:00	hoge	{"time":"07/Feb/2013:13:27:11 +0900","host":"127.0.0.1","req":"GET / HTTP/1.1","status":"304","size":"0","referer":"-","ua":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0","reqtime":"0.000","cache":"-"}

 
 
いやー、なんていうのか、この現場感。
はてなさんも素敵だし、こういうのをチョロっとプラグインとして組み込めちゃうFluentdもパネェっす。
 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中