vagrantを使ってfluentd、fluent-agent-liteでNginxのログを送受信する方法


ようやくlog周りをfluentdを使って収集する事になったので、fluentd、fluent-agent-liteの設定を勉強すべくvagrantに立ててみていじってみた。
Nginxを使う事が多いので、本番に近い形でnginxで試してみる。

##fluent-agent-liteとは？
fluentdは説明不要かと思いますが、[fluent-agent-lite]()とはログ収集対象のサーバに特化したもの。
正規表現パースしないため動作が軽く、負荷の高いアプリケーションサーバでも問題なく使用可能との事。

##vagrantの準備
まだvagrantを使った事が無い人は、下記のリンクを参考にしてインストールしてみて下さい。
[Vagrant セットアップ (Mac)](http://qiita.com/inouet/items/b36638adc2b5772db457)
[VirtualBoxとVagrantで開発環境を構築](http://www.webcyou.com/?p=4632)

vagrantを2つ起動する必要があります。
下記のようにそれぞれipアドレスを設定してvagrant upを実行。

(送信側)

```
$ cd /home/moriyaman/work/vagrant_sent
$ vagrant init centos
```

```Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.network "private_network", ip: "192.168.33.11"
end
```
```
$ vagrant up
```


(受信側)

```
$ cd /home/moriyaman/work/vagrant_rec
$ vagrant init centos
```
```Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.network "private_network", ip: "192.168.33.10"
end
```
```
$ vagrant up
```

##送信側：fluent-agent-lite

```
#fluent-agent-liteのインストール
yum install perl-ExtUtils-MakeMaker
git clone https://github.com/tagomoris/fluent-agent-lite
cd fluent-agent-lite
./bin/install.sh
```

インストールはこれで完了。設定ファイルを編集。

```/etc/fluent-agent-lite.conf
### LOGS: tag /path/to/log/file

TAG_PREFIX="nginx"
LOGS=$(cat <<"EOF"
access_log     /var/log/nginx/access.log
EOF
)

#ポートはデフォルトの24224から変更
PRIMARY_SERVER="192.168.33.10:24207"
```
fluent-agent-liteを起動させときます。

```
$ sudo /etc/init.d/fluent-agent-lite start
```

続いてNginx。自分はchefで入れましたが、インストール方法は任せます。

参考URL：
[CentOS6.xにてnginxの最新版をインストールする手順](http://qiita.com/utano320/items/0c0d9b84a9a28525bcb9)
[CentOS 6.3にnginxをインストールする方法](http://webkaru.net/linux/centos-6-3-nginx-install/)

インストールしたらNginxのlogフォーマットをltsvに変更。

```/etc/nginx/conf.d/default.conf
 log_format  ltsv  "remote_addr:$remote_addr\t"
                                 "remote_user:$remote_user\t"
                                 "time_local:$time_local\t"
                                 "request:$request\t"
                                 "status:$status\t"
                                 "body_bytes_sent:$body_bytes_sent\t"
                                 "http_refer:$http_referer\t"
                                 "http_user_agent:$http_user_agent";

    access_log  /var/log/nginx/access.log  ltsv;


```

※ltsvって？？という方は下記のURLが参考になります。
[LTSV FAQ - LTSV って何? どういうところが良いの?](http://d.hatena.ne.jp/naoya/20130209/1360381374)
[LTSVフォーマットなログを fluentd + GrowthForecast で料理](http://d.hatena.ne.jp/naoya/20130205/1360088927)

##受信側：fluentd
td-agentをyumでインストール

```/etc/yum.repos.d/td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
```

```
yum install td-agent
```

必要なプラグインをインストール。

```
$ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-parser
$ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-file-alternative
```

設定ファイルは下記のようにした。

```/etc/td-agent/td-agent.conf
<source>
  type forward
  port 24207
</source>

<match **.access_log>
  type copy
  <store>
    type file_alternative
    path /tmp/logs/access_log.*.log
    time_slice_format %Y%m%d
    output_include_time false
    output_include_tag false
    output_data_type attr:message
    add_newline true
  </store>
  <store>
    type parser
    tag nginx.access
    time_format %d/%b/%Y:%H:%M:%S %z
    format ltsv
    key_name message
  </store>
</match>

<match nginx.access>
  type file
  path /tmp/logs/parsed_log
</match>

```

吐き出しのフォルダのパーミッション周りを設定。

```
$ mkdir /tmp/logs/
$ sudo chown root:vagrant /tmp/logs/
$ sudo chmod 775 /tmp/logs/
```

fluentdがltsvをサポートしてくれているので、formatはltsvで問題なし！

fluentdを起動。

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

あとはvagrantの送信側のipにアクセスを飛ばせば、無事受信parse側で前/parse後のlogファイルを生成する事ができました。

```
$ ll /tmp/logs/

-rw-r--r--. 1 td-agent td-agent 3089  8月 13 14:22 2014 access_log.20140813.b5007bf755fc6330e.log
-rw-r--r--. 1 td-agent td-agent  347  8月 13 14:22 2014 parsed_log.20140813.b500838471fd35f8e
```

##上手く行かないときは・・・

####・送信側が上手く転送できているか？

下記のファイルにエラーメッセージが吐き出されていないか確認

```
$ sudo tail -f /tmp/fluent-agent.log 
```

####・受信側のtd-agentが立ち上がっているか？

僕はこれで少し手こずりました。

```
[vagrant@localhost ~]$ sudo /etc/init.d/td-agent start
Starting td-agent:                                   [  OK  ]
vagrant@localhost ~]$ sudo /etc/init.d/td-agent stop
Shutting down td-agent:                              [  失敗  ]
```

立ち上がったっぽく見えて、実は立ち上がってない。。。
シャットダウンで失敗するのはその証拠です。

その場合は、ログを確認しましょう。
勝手にエラーでシャットダウンかかっているケースが多いです。

```
$ sudo tail -1000 /var/log/td-agent/td-agent.log
```

####・受信側の設定ファイルはおかしくないか？

設定ファイルの記述方は[公式サイト](http://docs.fluentd.org/ja/articles/config-file)を見るのが一番早いです。
ググると結構formatで苦戦している人がいた。。。
自分で正規表現で作る場合はこのツールオススメ。
[Fluentular - Fluentdに設定する正規表現をチェック](http://www.moongift.jp/2014/04/fluentular-fluentd%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF/)



##参考URL

[fluentd (td-agent) , fluent-agent-liteを使ってMySQLのslowqueryをmongoDBに突っ込んで見やすくする](http://x1.inkenkun.com/archives/336)
[fluent-agent-liteとtd-agentで複数サーバーのログを集約 + chefでの設定例](http://qiita.com/cs_sonar/items/31bff9c14d479c94a47a)
[fluent-agent-lite と td-agent で、小さくはじめる fluentd](http://studio3104.hatenablog.com/entry/20120824/1345795228)
[Vagrant を使って fluentd のクラスタリングを試す](http://dev.classmethod.jp/server-side/server/fluentd-clustering/)
[さらいfluentdの設定ファイル #fluentd ～fluent-plugin-parser,fluent-plugin-file-alternative,fluent-plugin-elasticsearch](http://blog.livedoor.jp/ashibuya0128/archives/52058252.html)
[Fluentdでparser用の正規表現を書く・試す](http://d.hatena.ne.jp/tagomoris/20120715/1342368392)