Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る)

こんにちは、[cloudpack][] の @dz_ こと[大平かづみ][]です。

Prologue - はじめに
=============================
[Fluentd] について勉強をはじめました！
インフラ学校1年生の私ですが、ドキュメントを参考にPHPプログラムからログを送るところまで実践できました！

自身の備忘録がてら綴ります。尚、今回は Amazon Linux (t2.micro) で作業しました。


Fluentd のための前準備
=============================
まずは [前準備][Before Installing Fluentd] として、以下を事前に行っておくことが推奨されているようです。

### NTP (Network Time Protocol) の設定
ログのタイムスタンプに影響するため、しっかり設定するのが推奨されています。
(私は今回はタイムスタンプは特に重要でなかったので、設定していません。)

### ファイルディスクリプタの最大値の調整

```bash
ulimit -n
65535
```
であればOKだそうです。

これより数値が低い場合は、以下の対処が推奨されるそうです。 

1. `/etc/security/limits.conf` に以下を追記する
2. マシンをリブートして設定を反映する

```:/etc/security/limits.conf
# 以下を追加
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
```

### Networtk Kernel Parametre の最適化

複数台の Fluentd インスタンスで構成された高負荷環境の場合、以下の対処が推奨されるそうです。

1. `/etc/sysctl.conf` に以下の設定を追記する
2. `sysctl -w` を実行、またはリブートして設定を反映する

```:/etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240    65535
```

Fluentd  のインストール
============================
Fluentd の安定板である、`td-agent` をインストールをします。

[rpm パッケージを使った Fluentd のインストール][Installing Fluent Using rpm package] を参考に進めます。

td-agent (Fluentd) をインストール
-----------------------------

```bash
# Treasuredata のレポジトリを追加　(記述内容は後述)
sudo vi /etc/yum.repos.d/td.repo 

# yum の更新できるパッケージを確認
yum check-update

# td-agent がインストール可能か確認
yum list td-agent

# td-agent をインストール
sudo yum install td-agent

# td-agent がインストールされたか確認
$ yum list installed | grep td-agent
```

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

起動確認
-------------------

```bash
# Fluentd の起動
sudo /etc/init.d/td-agent start

# Fluentd のステータス確認
sudo /etc/init.d/td-agent status
```

HTTPからログを送信してみる
------------------------

```bash
# HTTPからログを送信してみる
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

# stdout に出力されたログを見てみる
cat /var/log/td-agent/td-agent.log

... 略 ...
2015-02-10 13:06:04 +0000 debug.test: {"json":"message"}
```
はじめてのログ収集、できました！ :sparkles: 

ログを送信する (PHP で)
===========================
このままさくさく進みます！

[PHPアプリケーションからデータをインポートする][Data Import from PHP Applications] を参考に、 [fluent-logger-php][] を利用して PHP からログを送信してみます。

設定ファイルの設定
---------------------------------

今回のように rpm でインストールした場合には、以下の場所に設定ファイルがあります。

```bash
# php からのログを受信できるように設定を変更 (後述)
sudo vi /etc/td-agent/td-agent.conf
```

`td-agent.conf` に、以下を追加します。

```:/etc/td-agent/td-agent.conf
# Unix Domain Socket Input
<source>
  type unix
  path /var/run/td-agent/td-agent.sock
</source>

# fluentd.test.** にマッチする入力を定義
<match fluentd.test.**>
  type stdout
</match>
```

fluent-logger-php ライブラリのインストール
------------------------------
今回は、私が慣れている [Composer][] でライブラリを用意しました。

```bash
# composer.json を記述する (後述)
vi composer.json

# composer をインストール
wget http://getcomposer.org/composer.phar

# fluent-logger-php をインストール
php -d detect_unicode=0 composer.phar install
```
以下は、[fluent-logger-php][] のインストール手順に記載されている compser.json の設定です。

```json:composer.json
{
    "name": "my-project",
    "version": "1.0.0",
    "require": {
        "fluent/logger": "v0.3.7"
    }
}
```


送信用プログラムを作成
--------------------------
```bash
# 送信用の php プログラムを作成する (後述)
vi sender.php
```

### 送信用の php プログラム
送信用の php プログラムはこちらです。
ドキュメントのサンプルコードをベースに、 `fluent-logger-php` を呼ぶ部分を調整したものです。

```php:sender.php
<?php
// composer でインストールした fluent-logger-php を呼び出す
require_once __DIR__.'/vendor/fluent/logger/src/Fluent/Autoloader.php';

use Fluent\Logger\FluentLogger;
Fluent\Autoloader::register();
$logger = new FluentLogger("unix:///var/run/td-agent/td-agent.sock");
$logger->post("fluentd.test.follow", array("from"=>"userA", "to"=>"userB"));
```

送信プログラムを実行
------------------------------
```bash
# 送信プログラムを実行する
php sender.php

# ログを確認する
tail /var/log/td-agent/td-agent.log

... 略 ...
2015-02-10 14:32:03 +0000 fluentd.test.follow: {"from":"userA","to":"userB"}
```

やたー！ログがちゃんと届いていました！！ :sparkles: 


Epilogue - おわりに
======================================

こんなに簡単に扱えるものだったんですねぇ！びっくりです。
未だに Amazon EC2 のインスタンスを立ち上げるにもドキドキする私ですが、半日程度でここまで実践することができました。

次回は、ログを Amazon S3 へ出力する部分に挑戦する予定です！

[Before Installing Fluentd]:http://docs.fluentd.org/articles/before-install "Before Installing Fluentd | Fluentd"
[Installing Fluent Using rpm package]:http://docs.fluentd.org/articles/install-by-rpm "Installing Fluentd Using rpm Package | Fluentd"

[Data Import from PHP Applications]:http://docs.fluentd.org/articles/php "Data Import from PHP Applications | Fluentd"
[fluent-logger-php]:https://github.com/fluent/fluent-logger-php "fluent/fluent-logger-php"
[Composer]:https://getcomposer.org/ "Composer"

[Fluentd]:http://www.fluentd.org/ "Fluentd | Open Source Data Collector | Unified Logging Layer"

近況
===================================================

Phalcon関連
---------------------------------------

- [爆速フレームワーク!! Phalcon PHP Framework](
http://qiita.com/dz_/items/55ae18f7fe3a873bace1 "爆速フレームワーク!! Phalcon PHP Framework")
- [Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会](http://qiita.com/dz_/items/974a90b32ba6a6e38182 "Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会")
- [Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！](http://qiita.com/dz_/items/e70d61487224b854b971 "Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！") ← :new: :sparkles: 

Amazon ECS関連
---------------------------------------

- [Check! Amazon EC2 Container Service で Docker を学びたい！(準備編)][my-amazon-ecs-docker-vol1]
- [Check! Amazon EC2 Container Service で Docker を学びたい！ (IAMポリシー編)][my-amazon-ecs-docker-vol2]

技術ブログ寄稿
-----------------------------------------

[cloudpack技術ブログ][cloudpack-blog]でも、AWS Lambda や 運用ツール Serf に関して記事を書いています。ご興味あれば読んでいただけると嬉しいです！

- <a href="http://blog.cloudpack.jp/author/oohira/" title="大平 かづみ の記事一覧 | cloudpack技術情報サイト"　target="_blank" rel="nofollow">大平 かづみ の記事一覧</a>


[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"

[my-amazon-ecs-docker-vol1]:http://qiita.com/dz_/items/625f55bc5de371d15caa "Check! Amazon EC2 Container Service で Docker を学びたい！(準備編)"
[my-amazon-ecs-docker-vol2]:http://qiita.com/dz_/items/44388a0908f8d18fe42d "Check! Amazon EC2 Container Service で Docker を学びたい！(IAMポリシー編)"