こんにちは、cloudpack の @dz_ こと大平かづみです。
Prologue - はじめに
Fluentd について勉強をはじめました!
インフラ学校1年生の私ですが、ドキュメントを参考にPHPプログラムからログを送るところまで実践できました!
自身の備忘録がてら綴ります。尚、今回は Amazon Linux (t2.micro) で作業しました。
Fluentd のための前準備
まずは 前準備 として、以下を事前に行っておくことが推奨されているようです。
NTP (Network Time Protocol) の設定
ログのタイムスタンプに影響するため、しっかり設定するのが推奨されています。
(私は今回はタイムスタンプは特に重要でなかったので、設定していません。)
ファイルディスクリプタの最大値の調整
ulimit -n
65535
であればOKだそうです。
これより数値が低い場合は、以下の対処が推奨されるそうです。
-
/etc/security/limits.conf
に以下を追記する - マシンをリブートして設定を反映する
# 以下を追加
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
Networtk Kernel Parametre の最適化
複数台の Fluentd インスタンスで構成された高負荷環境の場合、以下の対処が推奨されるそうです。
-
/etc/sysctl.conf
に以下の設定を追記する -
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
を呼ぶ部分を調整したものです。
<?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関連
- 爆速フレームワーク!! Phalcon PHP Framework
- Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会
-
Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール! ←
Amazon ECS関連
- Check! Amazon EC2 Container Service で Docker を学びたい!(準備編)
- Check! Amazon EC2 Container Service で Docker を学びたい! (IAMポリシー編)
技術ブログ寄稿
cloudpack技術ブログでも、AWS Lambda や 運用ツール Serf に関して記事を書いています。ご興味あれば読んでいただけると嬉しいです!