LoginSignup
7
7

More than 5 years have passed since last update.

Kibana + elasticsearch + fluent + fluent-agent-liteでNginxのログを集計して可視化するまで

Posted at

はじめに

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7