fluentdでログをs3とmongodbへ同時に送る方法

fluentdでログをs3とmongodbへ同時に送る方法メモ。



fluentdをインストールしテスト動作させる


まず最初に、OSのパラメーターをfluentdの動作に最適化させる設定を行う。ちょっと動かすだけならここはやらなくても大丈夫。


※ファイル編集後にサーバーを再起動する必要があります


# vi /etc/security/limits.conf
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536

# vi /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のインストール
curl -L http://toolbelt.treasure-data.com/sh/install-redhat.sh | sh

# 他のデーモンと同じように起動できます
/etc/init.d/td-agent start
/etc/init.d/td-agent stop
/etc/init.d/td-agent restart
/etc/init.d/td-agent status

# fluentdの設定ファイル
/etc/td-agent/td-agent.conf

# fluentd自体のログ
/var/log/td-agent/td-agent.log


fluentdをテスト動作させるコマンド。


/var/log/td-agent/td-agent.logに「2013-10-18 23:22:13 +0900 debug.test: {"json":"message"}」と書き込まれたら成功。


service td-agent start
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test


関連リンク

http://hivecolor.com/id/37

http://docs.fluentd.org/articles/install-by-rpm

http://docs.fluentd.org/articles/before-install



apacheのログをmongodbとs3に転送する


apacheのインストールと、fluentdがaccess_logを読めるようにする設定。


sudo yum install -y httpd
sudo chmod +rx /var/log/httpd
sudo chmod +r /var/log/httpd/access_log
sudo service httpd start


mongodbのインストール。


# vi /etc/yum.repos.d/MongoDB.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1

sudo yum install -y mongo-10gen mongo-10gen-server
sudo service mongod start


apacheのログをs3に転送するための設定。公式のサンプルとほぼ同じ。


# デフォルトの設定ファイルをコピーしておくと戻す時に楽
cp /etc/td-agent/td-agent.conf /etc/td-agent/td-agent.conf.default

# vi /etc/td-agent/td-agent.conf
<source>
  type tail
  format apache2
  path /var/log/httpd/access_log
  pos_file /var/log/td-agent/httpd.access_log.pos
  tag s3.apache.access
</source>

<match s3.*.*>
  # 出力先を複数指定
  type copy

  <store>
    # s3に転送
    type s3

    aws_key_id AKIAISFGNVR6MFCGFXBA
    aws_sec_key DEK4qbHubvEhosUoxvUs8HSin5F1BN/jiS+M+T3x
    s3_bucket fluent-test # 存在しなくても自動で作成される
    path logs/access_log_ # s3に転送するファイルの接頭語になる
    buffer_path /var/log/td-agent/s3

    time_slice_format %Y%m%d_%H%M%S # 毎秒書き出し。テスト用
    time_slice_wait 0m # 待ち時間なしでそっこー書き出し
    utc

    buffer_chunk_limit 256m
  </store>

  <store>
    # mongodbに転送
    type mongo

    database apache
    collection access
    host localhost
    port 27017

    flush_interval 10s
  </store>
</match>

# 設定ファイル再読み込み
sudo service td-agent reload


fluentdにログを転送させるためにlocalhostのapacheへ大量にアクセスする。


# 同時接続数100で10000回アクセス
ab -n 10000 -c 100 http://localhost/


s3への保存確認は、ブラウザからs3にアクセスしてファイルが作成されたか見ればよい。s3をファイルシステムにマウントして確認することもできる。参考:EC2とS3を連携させて使う方法【S3をマウントする】


mongodbへの保存確認は、手っ取り早くやるなら下記のクエリを実行すればよい。


$ mongo

> use apache;
> db.access.count();
> db.access.find().sort({$natural: -1}).limit(1).forEach(printjson);


関連リンク

http://docs.fluentd.org/articles/apache-to-s3



jsonのログをmongodbとs3に転送する


jsonログの読み込みに使える方法としては、「localhostの特定のポートをfluentdがlistenする方法」と、「特定のファイルをfluentdがtailする方法」がある。


fluentdを止める時のことを考えるとファイル経由の方がよさそう。なのでファイル経由で試してみる。


まずjsonログファイルを用意する。


sudo mkdir /var/log/original
sudo touch /var/log/original/action_log
sudo chmod +rx /var/log/original
sudo chmod +r /var/log/original/action_log


td-agent.confのsourceディレクティブだけを書き換える。


# vi /etc/td-agent/td-agent.conf
<source>
  type tail
  format json
  path /var/log/original/action_log
  pos_file /var/log/td-agent/original.action_log.pos
  tag s3.original.action
</source>

# 設定ファイル再読み込み
sudo service td-agent reload


ログファイルにjsonを追記する。fluentdがログファイルをtailしているため、ファイルに書き込みがあるだけでs3とmongodbにログが転送される。


echo '{"user": {"id": 1, "name": "taro"}, "action": "start", "agent": "Mozilla..."}' | sudo tee -a /var/log/original/action_log
echo '{"user": {"id": 1, "name": "taro"}, "action": "click", "agent": "Mozilla..."}' | sudo tee -a /var/log/original/action_log



先ほどと同じ方法で、s3とmongodbにログが出力されているか確認する。出力されていたら完成。


著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール