はじめに
Fluentd+ElasticSearchによるログ可視化の方法では、Fluentdをログ収集サービスとして使いました。今回は、ログ収集サービスとして、LogStashを用いたログ可視化の方法を解説します。
2014年02月26日 21時37分
Fluentd+ElasticSearchによるログ可視化の方法では、Fluentdをログ収集サービスとして使いました。今回は、ログ収集サービスとして、LogStashを用いたログ可視化の方法を解説します。
構築に必要なサーバー要件および、導入パッケージは下記のとおりです。
OS | Windows 7 Ultimate 32bit |
Cygwin | Setup Version 2.831 |
VirtualBox | 4.3.6 r91406 |
Vagrant | 1.4.1 |
パッケージ | Logstashサーバー | Logstashクライアント |
---|---|---|
ElasticSearch | 0.90.11 | n/a |
Kibana | 3.0.0milestone5 | n/a |
Redis | 2.8.6 | n/a |
Logstash | 1.3.3 |
Logstashによるログ収集システムは、下記のサービスから構成されています。
サーバー | サービス | 役割 |
---|---|---|
Logstashサーバー | Kibana | elasticsearchが保存したログの検索を行う、ウエブインターフェース。 |
elasticsearch | 受信した各種ログを保存する。 | |
Indexer | Brokerが送信したログを受信し、elasticsearchに送信する。 | |
Broker | Shipperが送信したログを受信し、Indexerに送信する。 | |
Logstashクライアント | Shipper | 収集したログをBrokerに送信する。 |
公式ドキュメントに従ってKibana,elasticsearch,Indexder,Brokerをセットアップします。
公式サイトからアーカイブをダウンロードし、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
公式サイトから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
出力されたログを確認します。
$ cat /var/log/elasticsearch/elasticsearch.log
公式サイトから、アーカイブをダウンロードし、ビルドします。
$ 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
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 # ログファイル
なお、#以降のコメントは設定内容をわかり易く記述したものですので、作成する設定ファイルには記述しないで下さい。(サービス起動時にエラーになります)
$ echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf $ sudo sysctl vm.overcommit_memory=1
自動起動スクリプトのひな型を参考にして、起動スクリプトを作成します。
$ 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
#!/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 $?
$ sudo chkconfig --add /etc/init.d/broker $ chkconfig broker --list $ sudo service broker start
$ cat /var/log/broker.log
公式サイトから、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
下記の内容の設定ファイルを作成します。
$ 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" } }
自動起動スクリプトのひな型を参考にして、起動スクリプトを作成します。
$ 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
#!/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 $?
Indexer起動時に読み込む、設定ファイルを作成します。
$ sudo vi /etc/sysconfig/indexer
conffile=${conffile-/etc/indexer.conf} jarfile=${jarfile-/opt/logstash/logstash-1.3.3-flatjar.jar}
$ sudo chkconfig --add /etc/init.d/indexer $ chkconfig indexer --list $ sudo service indexer start
Indexerの起動ログを確認します。
$ cat /var/log/indexer.log
Indexerが正常に起動すると、elasticsearchのログにクライアントが追加された旨のログが出力されます。
$ cat /var/log/elasticsearch/elasticsearch.log
以上で、サーバーセットアップは終了です。
クライアントでは、Shipperをセットアップします。
公式サイトから、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
下記の内容の設定ファイルを作成します。
$ 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" } }
自動起動スクリプトのひな型を参考にして、起動スクリプトを作成します。
$ sudo cp /etc/init.d/skeleton /etc/init.d/shipper $ sudo chmod 0755 /etc/init.d/shipper $ sudo vi /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
$ sudo /usr/lib/insserv/insserv shipper 1> /dev/null 2>& 1 $ ls /etc/*.d/*shipper $ sudo service shipper start
Shipperの起動ログを確認します。
$ cat /var/log/shipper.log
以上で、クライアントセットアップは終了です。
システムのセットアップが全て終了しましたので、動作確認を行います。
Cygwinターミナルから、クライアントに対してHTTPアクセスを行います。
$ curl http://192.168.0.30/
アクセスすると、Shipper→Broker→Indexer→elasticsearchの順にログが出力されますので、データが書き込まれているか確認できます。
同様に、ab2(Apache Benchimark)コマンドを用いてアクセスします。
$ ab2 -n 10 -c 10 http://192.168.0.30/
ブラウザで下記のサイトにアクセスし、(Logstash Dashboard)をクリックすると、グラグが表示されます。
http://192.168.0.50/kibana/