Posted at

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

More than 3 years have passed since last update.

こんにちは、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. マシンをリブートして設定を反映する


/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 のインストール を参考に進めます。


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


/etc/yum.repos.d/td.repo

[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 に、以下を追加します。


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

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


composer.json

{

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


送信用プログラムを作成

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

vi sender.php


送信用の php プログラム

送信用の php プログラムはこちらです。

ドキュメントのサンプルコードをベースに、 fluent-logger-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"));



送信プログラムを実行

# 送信プログラムを実行する

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 へ出力する部分に挑戦する予定です!


近況


Phalcon関連


Amazon ECS関連


技術ブログ寄稿

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