fluent-agent-liteとtd-agentで複数サーバーのログを集約 + chefでの設定例

AmazonのELB配下とかのインスタンスで、ちぎっては投げちぎっては投げしている環境だとサーバーのログはどこか１つに集めたい。できればリアルタイムに。

parseは必要なかったので

- [ログ送信側]　fluent-agent-lite
- [ログ集約側]　td-agent (とfluent-plugin-file-alternative)

を使ってやりました。

こちら
 [fluent-agent-lite と td-agent で、小さくはじめる fluentd](http://studio3104.hatenablog.com/entry/20120824/1345795228)
を参考にしたらばっちりでした

# ログ送信側

fluent-agent-lite インストール

```bash
git clone https://github.com/tagomoris/fluent-agent-lite
cd fluent-agent-lite/
bin/install.sh
```

/usr/local/fluent-agent-liteにいろいろインストールされました。
/etc/fluent-agent-lite.conf　が設定ファイルです。

```:/etc/fluent-agent-lite.conf
TAG_PREFIX="10.10.10.2"
LOGS=$(cat <<"EOF"
messages     /var/log/messages
EOF
)
PRIMARY_SERVER="10.10.10.1:24224"
```

`/var/log/messages`を送信してます。
この設定だと「10.10.10.2.messages」というタグで「10.10.10.1」のサーバーにログを送ります

起動

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

デフォルトだと`/tmp/fluent-agent.log`にログが出るので、うまく立ち上がらないときは確認します。

# ログ受信側

td-agentのインストール(CentOS)

```
curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
```

fluent-plugin-file-alternative のインストール

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

fluent-gemのパスは環境によって異なるそうです。これはCentOS6.5での例です。

設定はこんな感じにしました

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

<match **.messages>
  type file_alternative
  path /var/log/servers/messages.*.log
  time_slice_format %Y%m%d
  output_include_time false
  output_include_tag true
  output_data_type attr:message
  add_newline true
</match>
```

起動

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

うまくいけば`/var/log/servers/`にファイルができてます

```
-rw-r--r-- 1 td-agent td-agent   68  7月 15 13:02 2014 messages.20140715.MBeaONz7kAF3ffasa.log
```

今回は複数サーバーのどのサーバーからのログ排出かをわかるようにする為に`output_include_tag true`としました。
こうすると送られてきたログの行頭に送出側で設定したタグが出力されました。
今回の`/var/log/messages` はログにホスト名が入るので特に不要ですが、サーバーを識別する情報が出力されない場合に便利です。

```
# tail messages.20140715.MBeaONz7kAF3ffasa.log
10.10.10.2.messages     Jul 15 13:02:39 hogehoge root: hoge
```

td-agentのログは`/var/log/td-agent/td-agent.log`に出力されます。
ログファイルを受け取ったのに、どのタグにもマッチしなかった場合は親切に教えてくれるので、うまくいかない場合は参考にします。

```
[info]: adding source type="forward"
[info]: adding match pattern="**.messages" type="file_alternative"
[info]: listening fluent socket on 0.0.0.0:24224
[warn]: no patterns matched tag="10.10.10.2.messages.typo"
 ↑ログを受け取ったけど、どの設定にもマッチしないタグだった
```

# chefで管理する

ログ送出側はちぎってはなげを頻繁に行うという前提なので、タグの設定をいちいちやるのは面倒です。
chefでprovisionした際にfluent-agent-liteをインストールして、さらに自身のIPをtag prefixに設定するようにします。

fluent-agent-liteはSPEC/fluent-agent-lite.spec が用意されているのでrpmパッケージを作成して、そちらを使ったレシピの例です。

rpmパッケージの作成は[README](https://github.com/tagomoris/fluent-agent-lite)や[fluent-agent-liteのrpmを作成する - tanihiro.log](http://tanihiro.hatenablog.com/entry/2014/02/03/215246)を参考にしました。

今回、fluent-agent-lite-1.0-original.x86_64.rpmはfilesに置きました
多分こんな感じで動くと思います。

```rb:recipes/default.rb
  cookbook_file "/usr/local/src/fluent-agent-lite-1.0-original.x86_64.rpm" do
    source "fluent-agent-lite-1.0-original.x86_64.rpm"
    owner "root"
    group "root"
    mode "0644"
  end

  execute "fluent-agent-lite_install" do
    not_if "rpm -q fluent-agent-lite"
    user "root"
    group "root"
    command <<-EOH
        rpm -ivh /usr/local/src/fluent-agent-lite-1.0-original.x86_64.rpm
    EOH
    action :run
  end

  service "fluent-agent-lite" do
    supports :status => true, :restart => true, :reload => true
    action [ :enable, :start ]
  end

  template "/etc/fluent-agent-lite.conf" do
    source "fluent-agent-lite.conf.erb"
    owner "root"
    group "root"
    mode 0644
    notifies :restart, "service[fluent-agent-lite]", :delayed
  end

```

fluent-agent-lite.confのテンプレート

```pl:templates/default/fluent-agent-lite.conf.erb
TAG_PREFIX="<%= node[:ipaddress] %>"

LOGS=$(cat <<"EOF"
messages     /var/log/messages
EOF
)
PRIMARY_SERVER="10.10.10.1:24224"
```

<%= node[:ipaddress] %> のように書くとchefのnodeのIPが入ってきます。