はじめに
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/
