Logstash+ElasticSearchによるログ可視化の方法

2014年02月26日 21時37分

201402262137OELC00.png

前提条件

構築に必要なサーバー要件および、導入パッケージは下記のとおりです。

  1. 作業環境
    OSWindows 7 Ultimate 32bit
    CygwinSetup Version 2.831
    VirtualBox4.3.6 r91406
    Vagrant1.4.1
  2. サーバー要件
    サーバーLogstashサーバーLogstashクライアント
    ホスト名logstash-serverlogstash-client
    IPアドレス10.0.2.15(eth0)
    192.168.0.50(eth1)
    10.0.2.15(eth0)
    192.168.0.30(eth1)
    OSCentOS 6.5 x86_64 minimalubuntu-13.10 i386 server
    HDD8GB(SCSI)
    RAM512MB
    Apache2.2.15
    OpenJDK1.7.0
  3. 導入するパッケージ
    パッケージLogstashサーバーLogstashクライアント
    ElasticSearch0.90.11n/a
    Kibana3.0.0milestone5n/a
    Redis2.8.6n/a
    Logstash1.3.3

システム構成

Logstashによるログ収集システムは、下記のサービスから構成されています。

サーバーサービス役割
Logstashサーバー Kibanaelasticsearchが保存したログの検索を行う、ウエブインターフェース。
elasticsearch受信した各種ログを保存する。
IndexerBrokerが送信したログを受信し、elasticsearchに送信する。
BrokerShipperが送信したログを受信し、Indexerに送信する。
LogstashクライアントShipper収集したログをBrokerに送信する。
201402262137OELC01.png

サーバーセットアップ

公式ドキュメントに従ってKibana,elasticsearch,Indexder,Brokerをセットアップします。

  1. Kibanaのインストール

    公式サイトからアーカイブをダウンロードし、ApacheのDocumentRootに展開します。

    $ curl -sL https://download.elasticsearch.org/kibana/kibana/kibana-3.0.0milestone5.tar.gz | sudo tar zxf - -C /var/www/html
    $ sudo mv /var/www/html/kibana-3.0.0milestone5 /var/www/html/kibana
    
    201402262137OELC02.png
  2. EstaticSearchのインストール

    公式サイトからCentOS用のRPMパッケージをダウンロードし、インストールします。

    $ wget -q --no-check-certificate https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.90.11.noarch.rpm
    $ sudo rpm -ivh elasticsearch-0.90.11.noarch.rpm
    $ rm -f elasticsearch-0.90.11.noarch.rpm
    
    201402262137OELC03.png

    出力されたログを確認します。

    $ cat /var/log/elasticsearch/elasticsearch.log
    
    201402262137OELC04.png
  3. Broker(Redis)のインストール

    公式サイトから、アーカイブをダウンロードし、ビルドします。

    $ curl -sL http://download.redis.io/releases/redis-2.8.6.tar.gz | tar zxf -
    $ cd redis-2.8.6 && make 1> /dev/null 2>& 1
    $ sudo make install
    $ make clean 1> /dev/null 2>& 1
    
    201402262137OELC05.png
  4. Broker設定

    redis.confを参考にして、下記の内容の設定ファイルを作成します。

    $ sudo vi /etc/broker.conf
    
    daemonize yes                 # デーモン起動
    port 6379                     # 待ち受けポート
    maxmemory 128mb               # 最大使用メモリ
    maxclients 100                # 最大接続クライアント(Indexer)数
    pidfile /var/run/broker.pid   # PIDファイル
    logfile /var/log/broker.log   # ログファイル
    

    なお、#以降のコメントは設定内容をわかり易く記述したものですので、作成する設定ファイルには記述しないで下さい。(サービス起動時にエラーになります)

    201402262137OELC06.png
  5. システムパラメータの変更
    $ echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
    $ sudo sysctl vm.overcommit_memory=1
    
    201402262137OELC07.png
  6. 自動起動スクリプト作成

    自動起動スクリプトのひな型を参考にして、起動スクリプトを作成します。

    $ sudo cp /usr/share/doc/initscripts-9.03.40/sysvinitfiles /etc/init.d/broker
    $ sudo chmod 0755 /etc/init.d/broker
    $ sudo vi /etc/init.d/broker
    
    201402262137OELC08.png
    /etc/init.d/broker
    #!/bin/bash
    #
    # Broker(redis-server)
    #
    # chkconfig: 2345 84 20
    # description: Shipper->Broker connection server start/stop script
    
    . /etc/init.d/functions
    
    name="broker"
    prog="redis-server"
    conffile=/etc/$name.conf
    lockfile=/var/lock/subsys/$name
    exec="/usr/local/bin/$prog $conffile"
    
    [ ! -f $conffile ] && echo "$conffile not exist." && exit 1
    pidfile=`grep pidfile $conffile | cut -d' ' -f2`
    
    start() {
      status -p $pidfile $prog 1> /dev/null 2>& 1
      [ $? -eq 0 ] && return 1
      echo -n "Starting $name: "
      daemon --pidfile=$pidfile "$exec"
      retval=$?
      [ $retval -eq 0 ] && touch $lockfile
      echo
      return $retval
    }
    
    stop() {
      status -p $pidfile $prog 1> /dev/null 2>& 1
      [ $? -ne 0 ] && return 1
      echo -n "Stopping $name: "
      killproc -p $pidfile $prog
      retval=$?
      [ $retval -eq 0 ] && rm -f $lockfile
      echo
      return $retval
    }
    
    case "$1" in
      start|stop) $1;;
      status) status -p $pidfile $prog ;;
      restart) stop;start;;
      *) echo "Usage: $name {start|stop|status|restart}" && exit 1;;
    esac
    
    exit $?
    
  7. サービス起動と自動起動設定
    $ sudo chkconfig --add /etc/init.d/broker
    $ chkconfig broker --list
    $ sudo service broker start
    
    201402262137OELC09.png
  8. ログ確認
    $ cat /var/log/broker.log
    
    201402262137OELC10.png
  9. Indexer(logstash)のインストール

    公式サイトから、JARファイルをダウンロードします。

    $ sudo mkdir -p /opt/logstash
    $ sudo curl -sLo /opt/logstash/logstash-1.3.3-flatjar.jar https://download.elasticsearch.org/logstash/logstash/logstash-1.3.3-flatjar.jar
    
    201402262137OELC11.png
  10. Indexer設定

    下記の内容の設定ファイルを作成します。

    $ sudo vi /etc/indexer.conf
    
    input {
      redis {
        host => "127.0.0.1"
        data_type => "list"
        key => "logstash"
        codec => json
      }
    }
    output {
      stdout { debug => true debug_format => "json"}
    
      elasticsearch {
        host => "127.0.0.1"
      }
    }
    
    201402262137OELC12.png
  11. 自動起動スクリプト作成

    自動起動スクリプトのひな型を参考にして、起動スクリプトを作成します。

    $ sudo cp /usr/share/doc/initscripts-9.03.40/sysvinitfiles /etc/init.d/indexer
    $ sudo chmod 0755 /etc/init.d/indexer
    $ sudo vi /etc/init.d/indexer
    
    201402262137OELC13.png
    /etc/init.d/indexer
    #!/bin/bash
    #
    # Indexer(logstash)
    #
    # chkconfig:   2345 82 20
    # description: Indexer->elasticsearch connection agent start/stop script
    #
    name="indexer"
    [ -e /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
    [ -e /etc/sysconfig/indexer ] && . /etc/sysconfig/indexer
    pidfile=/var/run/$name.pid
    logfile=/var/log/$name.log
    lockfile=/var/lock/subsys/$name
    exec="java -jar $jarfile agent -f $conffile 1>> $logfile 2>& 1"
    
    start() {
      [ -f $jarfile ] || return 2
      [ -f $conffile ] || return 3
      status -p $pidfile $name 1> /dev/null 2>& 1
      [ $? -eq 0 ] && return 1
      echo -n $"Starting $name: "
      daemon --pidfile=$pidfile "$exec &"
      retval=$?
      pgrep -f $jarfile > $pidfile
      echo
      [ $retval -eq 0 ] && touch $lockfile
      return $retval
    }
    stop() {
      status -p $pidfile $name 1> /dev/null 2>& 1
      [ $? -ne 0 ] && return 1
      echo -n $"Stopping $name: "
      killproc -p $pidfile $name
      retval=$?
      echo
      [ $retval -eq 0 ] && rm -f $lockfile
      return $retval
    }
    restart() {
      stop; start
    }
    
    case "$1" in
      start|stop|restart) $1 ;;
      status) status -p $pidfile $name ;;
      *) echo $"Usage: $0 {start|stop|status|restart}" && exit 2
    esac
    exit $?
    
  12. 設定ファイルの作成

    Indexer起動時に読み込む、設定ファイルを作成します。

    $ sudo vi /etc/sysconfig/indexer
    
    conffile=${conffile-/etc/indexer.conf}
    jarfile=${jarfile-/opt/logstash/logstash-1.3.3-flatjar.jar}
    
    201402262137OELC14.png
  13. サービス起動と自動起動設定
    $ sudo chkconfig --add /etc/init.d/indexer
    $ chkconfig indexer --list
    $ sudo service indexer start
    
    201402262137OELC15.png
  14. ログ確認

    Indexerの起動ログを確認します。

    $ cat /var/log/indexer.log
    

    Indexerが正常に起動すると、elasticsearchのログにクライアントが追加された旨のログが出力されます。

    $ cat /var/log/elasticsearch/elasticsearch.log
    
    201402262137OELC16.png
    201402262137OELC17.png

    以上で、サーバーセットアップは終了です。

クライアントセットアップ

クライアントでは、Shipperをセットアップします。

  1. Shipper(logstash)のインストール

    公式サイトから、JARファイルをダウンロードします。

    $ sudo mkdir -p /opt/logstash
    $ sudo curl -sLo /opt/logstash/logstash-1.3.3-flatjar.jar https://download.elasticsearch.org/logstash/logstash/logstash-1.3.3-flatjar.jar
    
    201402262137OELC18.png
  2. Shipper設定

    下記の内容の設定ファイルを作成します。

    $ sudo vi /etc/shipper.conf
    
    input {
      file {
        type => "apache"
    #   path => "/var/log/httpd/access_log"    # for CentOS
        path => "/var/log/apache2/access.log"  # for Ubuntu
      }
    }
    filter {
      if [type] == "apache" {
        grok {
          match => { "message" => "%{COMBINEDAPACHELOG}" }
        }
      }
    }
    output {
      stdout { codec => rubydebug }
      redis { host => "192.168.0.50" data_type => "list" key => "logstash" }
    }
    
    201402262137OELC19.png
  3. 自動起動スクリプト作成

    自動起動スクリプトのひな型を参考にして、起動スクリプトを作成します。

    $ sudo cp /etc/init.d/skeleton /etc/init.d/shipper
    $ sudo chmod 0755 /etc/init.d/shipper
    $ sudo vi /etc/init.d/shipper
    
    201402262137OELC20.png
    /etc/init.d/shipper
    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides:          shipper
    # Required-Start:    $local_fs $remote_fs $network $syslog $named
    # Required-Stop:     $local_fs $remote_fs $network $syslog $named
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Start/stop shipper service
    # Description:       Shipper(logstash)->Broker(redis-server) connect agent
    ### END INIT INFO
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Description of the service"
    NAME=shipper
    JARFILE=/opt/logstash/logstash-1.3.3-flatjar.jar
    CONFFILE=/etc/shipper.conf
    PIDFILE=/var/run/$NAME.pid
    LOGFILE=/var/log/$NAME.log
    SCRIPTNAME=/etc/init.d/$NAME
    
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
    [ ! -e $JARFILE -o ! -e $CONFFILE ] && exit 1
    
    . /lib/init/vars.sh
    . /lib/lsb/init-functions
    
    DAEMON="/usr/bin/java"
    DAEMON_ARGS="-jar $JARFILE agent -f $CONFFILE"
    
    do_start()
    {
      start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
      || return 1
      start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON -- \
      $DAEMON_ARGS 1>> ${LOGFILE} 2>&1 &
      pgrep -f $JARFILE > $PIDFILE
      return 2
    }
    do_stop()
    {
      [ ! -f $PIDFILE ] && exit 1
      kill -9 `cat $PIDFILE`
      RETVAL=$?
      rm -f $PIDFILE
      return "$RETVAL"
    }
    
    case "$1" in
      start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
          0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
          2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
          2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
      restart)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
        0|1)
          do_start
          case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
          esac
          ;;
        *)
          # Failed to stop
          log_end_msg 1
          ;;
        esac
        ;;
      *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
        exit 3
      ;;
    esac
    
  4. サービス起動と自動起動設定
    $ sudo /usr/lib/insserv/insserv shipper 1> /dev/null 2>& 1
    $ ls /etc/*.d/*shipper
    $ sudo service shipper start
    
    201402262137OELC21.png
  5. ログ確認

    Shipperの起動ログを確認します。

    $ cat /var/log/shipper.log
    
    201402262137OELC22.png

    以上で、クライアントセットアップは終了です。

動作確認

システムのセットアップが全て終了しましたので、動作確認を行います。

  1. curlによるHTTPアクセス

    Cygwinターミナルから、クライアントに対してHTTPアクセスを行います。

    $ curl http://192.168.0.30/
    
    201402262137OELC23.png

    アクセスすると、Shipper→Broker→Indexer→elasticsearchの順にログが出力されますので、データが書き込まれているか確認できます。

    201402262137OELC24.png
  2. ab2によるHTTPアクセス

    同様に、ab2(Apache Benchimark)コマンドを用いてアクセスします。

    $ ab2 -n 10 -c 10 http://192.168.0.30/
    
    201402262137OELC25.png
    201402262137OELC26.png
  3. Kibanaよるデータ確認

    ブラウザで下記のサイトにアクセスし、(Logstash Dashboard)をクリックすると、グラグが表示されます。

    http://192.168.0.50/kibana/
    
    201402262137OELC27.png