php環境での使用を想定しているのでrubyのインストールはせず、
td-agentがAmazon Linuxで動作するか試してみた。
ちなみにrubyでも導入は簡単そうでした。
参考
http://docs.fluentd.org/articles/install-by-rpm
http://docs.fluentd.org/articles/php
検証環境
- OS Amazon Linux 64bit
- インスタンスの種類 マイクロインスタンス
- ログの受信用サーバ1インスタンス
- ログの送信用サーバ1インスタンス
- PHP5.4から任意の値を送信(FuelPHP上で使ってみた)
1. td-agentのインストール
#次の1行をec2-userで実行した。
curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh
ビルド済みのパッケージをインストールするだけなので、microインスタンスでもすぐに完了した。
Installing:
td-agent x86_64 1.1.12-0 treasuredata 20 M
Installing for dependencies:
compat-libtermcap x86_64 2.0.8-49.2.amzn1 amzn-main 16 k
compat-readline5 x86_64 5.2-17.3.amzn1 amzn-main 156 k
openssl098e x86_64 0.9.8e-17.8.amzn1 amzn-main 894 k
td-libyaml x86_64 0.1.4-1 treasuredata 125 k
2. 設定ファイル(ログ受信側)
/etc/td-agent/td-agent.conf
<source>
type forward
port 24224
</source>
<match log.**>
type file
path /var/log/fluent/log
time_slice_format %Y%m%d%H (1時間毎にファイル分割してみた)
time_slice_wait 10m
time_format %Y%m%d %H:%M:%S
compress gzip
</match>
3. 設定ファイル(ログ送信側)
/etc/td-agent/td-agent.conf
<source>
type unix
path /var/run/td-agent/td-agent.sock
</source>
<match log.**>
type forward
send_timeout 60s
recover_wait 10s
heartbeat_interval 1s
phi_threshold 8
hard_timeout 60s
<server>
host 10.***.***.***(受信サーバのプライベートIPアドレス)
port 24224
</server>
<secondary>
type file
path /var/log/fluent/forward-failed
</secondary>
</match>
4. SecurityGroupsの設定
td-agentは、デフォルトで24224番ポートを使用するが、
TCPとUDPの両方を使用するので、両方開けておく必要がある。
http://docs.fluentd.org/articles/in_forward
http://docs.fluentd.org/articles/out_forward
5. td-agentの起動
送信、受信双方のtd-agentを起動する。
起動
/etc/init.d/td-agent start
停止
/etc/init.d/td-agent stop
再起動
/etc/init.d/td-agent restart
状態確認
/etc/init.d/td-agent status
自動起動
chkconfig --level 345 td-agent on
6. fluent-logger-phpのインストール
公式サイト掲載のパッケージをそのまま利用してみた。
git clone https://github.com/fluent/fluent-logger-php.git
cp -r src/Fluent /path/to/
7. ログを送信してみたサンプルコード
require_once '/path/to/Fluent/Autoloader.php';
use Fluent\Logger\FluentLogger;
Fluent\Autoloader::register();
$key = 'log.pv';
$val = array(
'time' => date('Y-m-d H:i:s'),
'member_id' => 'aaaaaaa',
'useragent' => $_SERVER['HTTP_USER_AGENT'],
'ipaddress' => $_SERVER['HTTP_X_FORWARDED_FOR'],
);
$logger = new FluentLogger("unix:///var/run/td-agent/td-agent.sock");
$logger->post($key, $val);
8. 試してみた感想
出力されるログは、JSON形式なので集計するときに取り扱いが簡単ですね。
また、追加したい値が増えてもこれなら気兼ねなく追加できます。
基本的なことでかつ重要なことですが、今のところログの取りこぼしがありません。
試しに受信側落としてみたらセカンダリーに出力してくれるし、設定によってはコピーして転送してくれたりで、
冗長化や障害時のリカバリーも可能ですね。
日々すごい量のトラフィックをさばいている次の企業で導入されているのも納得です。
http://docs.fluentd.org/articles/users
あと、td-agentならrubyではない環境でも簡単にfluentdが導入できそうです。
ただし、Windowsは除くようですが・・・。
Fluentd doesn't run on Windows.