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にログが出力されているか確認する。出力されていたら完成。