fluentdによるlogの集約とS3への保存
業務でログ収集をやることになったのでその時のメモ
やりたいイメージ
- A B C Dのnginxのログはltsv形式
- A B C DのログをEに集約
- Eに集約したログを大dailyでzipしてs3に保存
各サーバーのHDのスペックは以下
A B C D - 8G
E - 100G
まずは各サーバーの設定とtd-agentのインストール
[公式ドキュメント]
http://docs.fluentd.org/v0.12/articles/quickstart
[インストール前に]
/etc/security/limits.conf
root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536
/etc/sysctl.conf
net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 10240 65535
[インストール]
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
[設定]
コレクター A B C D
<source> @type tail tag nginx.log path /usr/local/nginx/logs/access.log pos_file /var/log/td-agent/access.log.pos format ltsv time_key time </source> <match nginx.log> type forward buffer_path /var/log/td-agent/buffer/access.*.buffer buffer_chunk_limit 8M buffer_queue_limit 256 queued_chunk_flush_interval 20s try_flush_interval 1 flush_interval 60s retry_wait 30s retry_limit 5 num_threads 2 <server> name nginx_log host xx.xxx.xxx.xxx port 24224 </server> </match>
集約サーバー E
<source> type forward port 24224 bind 0.0.0.0 </source> <match nginx.log> type copy #<store> # type file # format ltsv # path /var/log/fluentd/nginx_log # buffer_chunk_limit 30g # time_slice_format %Y%m%d # time_slice_wait 1m # compress gzip # flush_at_shutdown true #</store> <store> @type s3 path log/nginx/%Y/%m/%d/ #S3の保存ディレクトリ format ltsv #logの形式 aws_key_id XXXXXXXXXXXXXXX aws_sec_key XXXXXXXXXXXXXXX s3_bucket hoge_bucket s3_region hoge_region acl public-read buffer_path /var/log/fluentd/access.*.log time_slice_format %d buffer_type file time_slice_wait 10m buffer_chunk_limit 30g #デイリーのログの容量に合わせて変更 </store> </match>
※ログのローテトでハマりました。buffer_chunk_limitが肝
参考
@Spring_MT buffer_size_limit ではなくて buffer_chunk_limit でしたorz しかし v0.10.27 の buf_file だとデフォルトで 8MB なので、何か違う気がする…。
— Sadayuki Furuhashi (@frsyuki) 2012年11月27日
[監視用スクリプト]*cronで動かす
参考
- td-agentのプロセスが死んだ場合再起動&slackへの通知
#!/bin/sh #slack通知 function post_to_slack () { SLACK_MESSAGE="*$1*" SLACK_URL=hoge case "$2" in RECOVER) SLACK_ICON=':slack:' ;; DOWN) SLACK_ICON=':warning:' ;; *) SLACK_ICON=':slack:' ;; esac curl -X POST --data "payload={\"text\": \"<!channel> \n ${SLACK_ICON} ${SLACK_MESSAGE}\"}" ${SLACK_URL} } function restart_td_agent () { sudo /etc/init.d/td-agent restart } function stop_td_agent () { sudo /etc/init.d/td-agent stop } #test用 #stop_td_agent SERVER_NAME="manga-OauthChargeUser-api-prod_0" # process数が2以下ならalert&t再起動 PROCESS_COUNT=`ps w -C ruby -C td-agent --no-heading | grep td-agent | wc -l` if [ ${PROCESS_COUNT} != 2 ] ; then DATE=`date` STATUS="DOWN" MESSAGE="[${SERVER_NAME}][td-agent] \`\`\`プロセスがダウンしました\`\`\`" post_to_slack "${MESSAGE}" "${STATUS}" restart_td_agent NOT_RECOVER=true while $NOT_RECOVER do PROCESS_COUNT=`ps w -C ruby -C td-agent --no-heading | grep td-agent | wc -l` if [ ${PROCESS_COUNT} == 2 ] ; then STATUS="RECOVER" MESSAGE="[${SERVER_NAME}][td-agent] \`\`\`プロセスが復帰しました\`\`\`" NOT_RECOVER=false post_to_slack "${MESSAGE}" "${STATUS}" fi done fi exit 0