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

Prologue – はじめに

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

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

Fluentd のための前準備

まずは 前準備 として、以下を事前に行っておくことが推奨されているようです。

NTP (Network Time Protocol) の設定

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

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

ulimit -n
65535

であればOKだそうです。

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

  1. /etc/security/limits.conf に以下を追記する
  2. マシンをリブートして設定を反映する
# 以下を追加
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 を実行、またはリブートして設定を反映する
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 のインストール を参考に進めます。

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

# 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
[treasuredata]
name=TreasureData
baseurl=http://packages.treasuredata.com/redhat/$basearch
gpgcheck=0

起動確認

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

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

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

# 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"}

はじめてのログ収集、できました!

ログを送信する (PHP で)

このままさくさく進みます!

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

設定ファイルの設定

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

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

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 でライブラリを用意しました。

# 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 の設定です。

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

送信用プログラムを作成

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

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

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

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

送信プログラムを実行

# 送信プログラムを実行する
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"}

やたー!ログがちゃんと届いていました!!

Epilogue – おわりに

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

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

元記事はこちらです。
Check! はじめての fluentd を Amazon Linux で動かしてみる (ログを PHP から送る)