fluentdによるlogの集約とS3への保存

業務でログ収集をやることになったのでその時のメモ

やりたいイメージ

f:id:sonedayuya:20170210231910p:plain

  • 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が肝
参考





[監視用スクリプト]*cronで動かす

参考

www.slideshare.net

  • 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