Kibana + elasticsearch + fluent + fluent-agent-liteでNginxのログを集計して可視化するまで
はじめに
Kibana環境の構築 → NGNIXのログを集計 → 可視化のところまでの覚書 * Ruby on Rails 4.2 ← こいつのアクセスログを可視化 * NGINX (Latest) * Unicorn (Latest) * Mysql (Latest)
手順
ログ送信側
- 1.NGINXのログ出力設定
- 2.アクセスログを拾って集計サーバーへ転送(今回はローカルに転送)
ログ集計側
- 1.転送されてきたログの受信
- 2.ログをパースしてelasticsearchへ転送
- 3.elasticsearchの設定
- 4.kiabanを使ってelasticsearchのログを可視化
ローカル
- 1.hostsに設定したserver nameを追記(ローカル)
ログ送信側の設定
1.NGINXのログ出力設定
- NGINXのログの出力形式をLTSVにする
$ sudo vim /etc/nginx/nginx.conf # 下記の設定を追記 http { ~~~~~~~省略~~~~~~~~~~ log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; log_format ltsv 'host:$remote_addr\t' 'user:$remote_user\t' 'time:$time_iso8601\t' 'method:$request_method\t' 'uri:$request_uri\t' 'protocol:$server_protocol\t' 'status:$status\t' 'size:$body_bytes_sent\t' 'request_time:$request_time\t' 'upstream_response_time:$upstream_response_time\t' 'upstream_addr:$upstream_addr\t' 'referer:$http_referer\t' 'user_agent:$http_user_agent\t'; access_log /var/log/nginx/access.log ltsv; ~~~~~~~省略~~~~~~~~~~
2.アクセスログを拾って集計サーバーへ転送
- ログを転送するために
fluent-agent-lite
をインストール
# 依存モジュールのインストール $ sudo yum -y install perl-ExtUtils-MakeMaker $ sudo yum -y install perl # agent-liteのインストール $ git clone https://github.com/tagomoris/fluent-agent-lite $ git sudo ./fluent-agent-lite/bin/install.sh # サービスの自動起動設定 $ sudo chkconfig fluent-agent-lite on $ sudo chkconfig --list fluent-agent-lite fluent-agent-lite 0:off 1:off 2:on 3:on 4:on 5:on 6:off $ sudo /etc/init.d/fluent-agent-lite start
- fluent-agent-liteの設定
$ sudo vim /etc/fluent-agent-lite.conf # 設定ファイルの中身を編集 # fluentd tag prefix of all LOGS TAG_PREFIX="" # fluentd message log attribute name (default: message) FIELD_NAME="message" # LOGS: tag /path/to/log/file # 可視化したログはここで拾い上げて転送してあげる LOGS=$(cat <<"EOF" nginx.access /var/log/nginx/access.log EOF ) # SERVERNAME[:PORTNUM] # port number is optional (default: 24224) PRIMARY_SERVER="127.0.0.1" ### or, PRIMARY SERVER LIST FILE of servers # PRIMARY_SERVERS_LIST="/etc/fluent-agent.servers.primary" # secondary server setting is optional... # SECONDARY_SERVER="secondary.fluentd.local:24224" # SECONDARY_SERVERS_LIST is available as like as PRIMARY_SERVERS_LIST # max bytes to try read as one action from tail (default: 1MB) # READ_BUFFER_SIZE=1048576 # PROCESS_NICE default: 0
- 設定後は再起動
$ sudo /etc/init.d/fluent-agent-lite restart
ログ集計側の設定
1.転送されてきたログの受信
- ログの受信やパースのために
td-agent
のインストール
# yumレポの追加 $ sudo vim /etc/yum.repos.d/td.repo # 設定ファイル内 [treasuredata] name=TreasureData baseurl=http://packages.treasuredata.com/2/redhat/\$releasever/\$basearch gpgcheck=1 gpgkey=http://packages.treasuredata.com/GPG-KEY-td-agent
# インストール & 起動設定 $ sudo yum -y install td-agent $ sudo /etc/init.d/td-agent start $ sudo chkconfig td-agent on $ chkconfig --list td-agent
- fluent用ログの出力場所を作成
$ sudo mkdir -m 755 /var/log/aggregated && sudo chown td-agent:td-agent /var/log/aggregated
- 設定用の必要なプラグインのインストール
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-parser fluent-plugin-elasticsearch fluent-plugin-typecast fluent-plugin-file-alternative
ログの受信設定
# 24224で転送されてきたログを受け付け $ sudo vim /etc/td-agent/td-agent.conf <source> type forward port 24224 </source> <match **> type file path /var/log/aggregated/unmatched/unmatched </match>
2.ログをパースしてelasticsearchへ転送
- elasticsearchへの転送設定
$ sudo vim /etc/td-agent/td-agent.conf # 設定情報を追記 ~~~~~~~~~~~~~~~~ 省略~~~~~~~~~~~~~~~~~~~~~~ # Elascticsearch用のパース <match nginx.access.**> type copy <store> type parser format ltsv add_prefix parsed key_name message </store> <store> type stdout </store> </match> # パースしたデータのキャスト <match parsed.nginx.access.**> type typecast item_types request_time:string, upstream_response_time:string tag casted.nginx.access </match> # パースキャスト済みのデータをElascticsearchに転送 <match casted.nginx.access> type_name nginx type elasticsearch include_tag_key true tag_key @log_name host localhost port 9200 logstash_format true flush_interval 10s buffer_type file buffer_path /var/log/td-agent/buffer/casted.nginx.access.buffer </match> ~~~~~~~~~~~~~~~~ 省略~~~~~~~~~~~~~~~~~~~~~~
- 再起動
$ sudo /etc/init.d/td-agent restart
- elasticsearchのインストール
# 依存モジュールのインストール $ sudo yum -y install java-1.7.0-openjdk
- yumレポの追加
[elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=http://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
3.elasticsearchの設定
$ sudo yum -y install elasticsearch # 起動設定 $ sudo /etc/init.d/elasticsearch start $ sudo chkconfig elasticsearch on $ chkconfig --list elasticsearch elasticsearch 0:off 1:off 2:on 3:on 4:on 5:on 6:off
$ sudo vim /etc/elasticsearch/elasticsearch.yml # 設定ファイル内 http.cors.allow-origin: "/.*/" http.cors.enabled: true network.host: 0.0.0.0 # 設定後に再起動 $ sudo /etc/init.d/elasticsearch restart
4.kiabanを使ってelasticsearchのログを可視化
- 可視化のために
kibana
のインストール
# zipファイルの取得 $ wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz # 解凍 $ tar xvfz kibana-4.3.1-linux-x64.tar.gz $ mv -n kibana-4.3.1-linux-x64 kibana
- kibanaの起動スクリプト設置
$ sudo vim /etc/init.d/kibana #!/bin/bash # chkconfig: 2345 85 15 # description: ログ可視化サービス export NAME=kibana export LOG_DIR=/var/log/${NAME} export PID=/var/run/${NAME}.pid export LOG=${LOG_DIR}/${NAME}.log test -d $LOG_DIR || mkdir $LOG_DIR case $1 in 'start' ) $0 status >/dev/null 2>&1 && echo "${NAME} is already running." && exit 1 nohup /home/vagrant/${NAME}/bin/${NAME} 0<&- &> $LOG & echo $! > $PID ;; 'stop' ) $0 status >/dev/null 2>&1 || echo "${NAME} is not running." || exit 1 test -f $PID && cat $PID | xargs kill -s SIGKILL && rm $PID ;; 'restart' ) $0 stop sleep 1 $0 start ;; 'status' ) test -f $PID || echo "${NAME} not running." || exit 1 PID=`cat $PID` kill -s 0 $PID >/dev/null 2>&1 && echo "${NAME} is running." && exit 0 echo "${NAME} not running." exit 1 ;; *) echo "Usage: $0 start|stop|restart|status" ;; esac # 設定の変更 $ sudo chmod 755 /etc/init.d/kibana & sudo chown root:root /etc/init.d/kibana
# 起動設定 $ sudo /etc/init.d/kibana start $ sudo /etc/init.d/kibana status kibana is running. $ sudo chkconfig kibana on $ chkconfig --list kibana kibana 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# kibana用のルートをNginxに通す $ sudo vim /etc/nginx/conf.d/kibana.conf server { listen 80; root /home/vagrant/kibana/; server_name kibana.local; index index.html; location / { proxy_pass http://localhost:5601; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } # 再起動 $ sudo /etc/init.d/nginx restart
- kibanaの設定変更
$ vim kibana/config/kibana.yml # 下記を追記 elasticsearch.url: "http://localhost:9200" host: "localhost" # kibanaを再起動 $ sudo /etc/init.d/kibana restart
ローカルの設定
1.hostsに設定したserver nameを追記(ローカル)
$ sudo vim /etc/hosts # 仮想環境のipを指定 192.168.33.10 kibana.local
最後に
下記にアクセスすると見れている! http://kibana.local