いまさら fluentd v1 をはじめてみた、その１

# いまさら fluentd v1 はじめてみる
「[fluentd](http://www.fluentd.org/) + [Kibana](Kibana) + [elasticsearch](http://www.elasticsearch.org/)」 やら 「fluentd + [MongoDB](http://www.mongodb.org/)」とログ解析してDBに入れつつグラフ化しちゃうなんて巷で流行っているな～～と指をくわえてみてたんです。そして１年経過・・・そろそろやらねば！と重い腰をあげてみました。そしてまたハマったｗ
※fluentd v2がでております～

# fluentd って
システム構築したことある人なら経験があるように各システムに散らばったログを収集＆解析、グラフ化するのって簡単そうで結構大変な作業ですよね。[fluentd](http://www.fluentd.org/) は、ruby で書かれたログ解析ツール（ログ収集管理ツール？）で、このツールを使うことにより簡単に処理できるようになります。
また多彩な[入出力プラグイン](http://docs.fluentd.org/ja/articles/)が用意されていますし、こんなのないかな？と思うと[別途公開](http://www.fluentd.org/datasources)されていたりと殆ど自分で作成する必要がない位に充実しています。

> [fluentdによるログ収集システムの構築～基本編](http://success.tracpath.com/blog/2014/04/22/fluentd_opensource_log_management-2/)
> [Fluentdにおけるログ運用](http://qiita.com/kenzan100/items/9891a24263de77af6f31)

## ハマった
マニュアルを嫁、といわれそうですが・・・。fluentd でのin/outはすべて json で処理されるということ。
そのためアプリケーションログに対し入力プラグインに対応していないとだめｗ。かといっても正規表現を少し勉強すれば対応可能。

# とりあえず初心者らしくかる～く実装してみます
「[nginx](http://nginx.org/ja/) ⇒ fluentd ⇒ MongoDB」の記事が多くヒットするのですが、ここは初心者っぽいとこから実装してみます。構成として以下のような感じ（[vm を３つ用意してね](http://qiita.com/murachi1208/items/99daa3ca069d907a7b50)）。
あと入力するログ（aa.log/bb.log）は、勉強用のため独自フォーマットにしてみました。
※だって apache やら nginx だとプラグインがあるので・・・

![fluentd_1.png](https://qiita-image-store.s3.amazonaws.com/0/44540/8bed8d51-5a1e-7f94-2e86-d51763ce17cc.png)

## fluentd のインストール
対象のサーバ（送信側、受信側）に fluentd をインストールします。環境によって[インストールする手順](http://docs.fluentd.org/articles/install-by-rpm-v1)は違えども基本的に簡単に導入できます。
※shを見るとわかるけけど /etc/yum.repos.d/td.repo にレポジトリを登録します。

```text:command
$ sudo su
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
```

## 送信側の設定
/tmp/aa.log に行が追加されたイベントで td-agent が動作し、ログ収集サーバに http でデータを転送する設定を行います（/tmp/bb.log も同じ）。

```/etc/td-agent/td-agent.conf
<source>
  type tail
  path /tmp/aa.log
  pos_file /tmp/access.pos
  format /^(?<date>[^\]]*) (?<host>[^ ]*)$/
  time_format %d/%b/%Y:%H:%M:%S
  tag test.access
</source>

<match test.access>
  type forward
  buffer_chunk_limit 256m
  buffer_queue_limit 128
  flush_interval 5s
  <server>
    host 192.168.11.106
    port 24224
  </server>
</match>
```

ここで特筆すべき点は、sourceディレクティブ の 「format」です。正規表現で指定しますが特殊な記述の方法なので独自ログを解析しようと思った場合は少し手間がかかるので、[Fluentular](http://fluentular.herokuapp.com/parse?regexp=%5E%28%3F%3Cdate%3E%5B%5E%5C%5D%5D*%29+%28%3F%3Chost%3E%5B%5E+%5D*%29&input=21%2FJun%2F2014%3A03%3A05%3A43+aaaa&time_format=%25d%2F%25b%2F%25Y%3A%25H%3A%25M%3A%25S) サイトで試行錯誤しながら作成するのが楽チンです。
> [fluentdのformat(正規表現)の作り方について試行錯誤中](http://blog.glidenote.com/blog/2012/07/15/fluentd-regex-debug/)

## 受信側の設定
データを http で受信し /var/log/td_log/td_access に結果を出力する設定を行います。

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

<match test.access>
  type file
  time_slice_format %Y%m%d_%H%M
  time_slice_wait 1m
  path /var/log/td_log/td_access
  time_format %Y%m%dT%H%M%S%z
</match>
```

type file プラグインが更新されているのか、ググと上記の設定で **td_access.log** ができるお！と書いてあるけど実際には「 **td_access.log** + time_slice_format + _0.log」で出力されます。
また td__access.20140622_1413.b4fc65c8fe4bf524b 形式のファイル名になってしまうのは、fluentd がログデータを確定する前段階のファイルとして一時ファイルを作成するからです（time_slice_format の形式でまとまるらしい）。
> [fluentdでTimeSlicedOutputを使ったプラグインを書いてみた](http://erukiti.hatenablog.com/entry/20120208/1328719264)

## テスト方法
fluentd が動作して状態をみることによりイベントの流れが判ると思うので最初は、```td-agent -vv``` コマンドを送受信側で起動しいたほうがよい。構文エラーの場合も起動せず止まるので原因が追究しやすい。

```command
$ sudo td-agent -vv
```

送信側

```command
$ echo "22/Jun/2014:09:14:05 aaaa" >> /tmp/aa.log          # ログとして有効なことを確認
$ echo "22/Jun/2014:09:14:05 aaaa ddd fff" >> /tmp/aa.log  # ログとして無効なことを確認
```

# さて運用してみるか 
実際にサービスとして起動してみます。 **が** ログが出力されない状態になるかもしれません。
しかもサービスを起動しても [OK] って表示されれている・・・。
そんなときは、fluentd の起動ログ /var/log/td-agent/td-agent.log を見ましょう。ここにすべてが書いてあるｗ
※td-agent ユーザで td-agent を起動するので 「:EACCES: Permission denied」になってるときもある。

```
# /etc/init.d/td-agent restart
Starting td-agent:                                         [  OK  ]
``` 

# 次は
[ltsv](http://d.hatena.ne.jp/naoya/20130209/1360381374) プラグンを使った方法を勉強してみる（[その２](http://qiita.com/murachi1208/items/734915c8539995bdfe39)）の予定ですｗ

## 参考サイト
> [td-agent(fluentd)のposファイルの作成タイミングとかその他もろもろもメモ](http://tweeeety.hateblo.jp/entry/20131211/1386728410)
> [【fluentd初心者】td-agentに起動偽装された件について](http://qiita.com/jumbOS5/items/c7ae01f1456ef61f66a8)
> [fluentdの簡単な使い方、設定方法一覧](http://hivecolor.com/id/37)