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