2012年9月12日水曜日

logstash 1.1.1で複数のサーバからApacheログを収集する

前回の続き。
前回は同一サーバ上のApacheログを直接読み込んでlogstashに貯め込む構成を作ったので、今回は次のステップとして、複数サーバのApacheログをlogstashで収集する構成を作ってみる。
…といっても、まずはひとつのサーバ上で試してみることとする。

公式ページのCentralized Setup with Event Parsingを参考にする。

動作させるコンポーネントとデータの流れは、こんな感じ。
Figure.1 logstashのアーキテクチャ
Redisのインストール
まずはRedisをインストールする。
/tmp/redisにRedisのソースをダウンロード。

$ cd /tmp
$ mkdir redis
$ cd redis
$ wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz
$ tar xvzf redis-2.4.17.tar.gz
redis-2.4.17/
redis-2.4.17/.gitignore
(snip)
…
makeする。
$ cd redis-2.4.17
$ make
cd src && make all
make[1]: ディレクトリ `/tmp/redis/redis-2.4.17/src' に入ります
(snip)
…
makeが終わったら、redisのディレクトリを/opt/redisに移動する。
$ cd ..
$ mv redis-2.4.17 /opt/redis
Redisを起動する。
$ cd /opt/redis
$ src/redis-server
[27291] 12 Sep 12:58:43 - 0 clients connected (0 slaves), 567120 bytes in use
起動したみたいだ。
shipper(ログを親サーバに転送する役割)を立ち上げる
次に、Apacheのログを集めてRedisに送る機能を実装する。
今回は同一サーバ上のApacheログを対象にするが、このセクションで実施する作業を別のサーバでも行えば、そのサーバ上のApacheログも収集することが可能のはず。

まずはlogstashの設定ファイルを作る。
$ cd /opt/logstash
$ vi shipper.conf
input {
  file {
    type => "apache"
    path => "/var/log/httpd/access_log"
  }
}

filter {
  grok {
    type => "apache"
    pattern => "%{COMBINEDAPACHELOG}"
  }
}

output {
  stdout { debug => true debug_format => "json"}
  redis { host => "127.0.0.1" data_type => "list" key => "logstash" }
}
起動スクリプトを書く。
$ vi shipper.sh
java -jar logstash-1.1.1-monolithic.jar agent -f shipper.conf
起動してみる。
$ chmod +x shipper.sh
$ ./shipper.sh
すると、Redisの標準出力に
[27291] 12 Sep 13:00:29 - 1 clients connected (0 slaves), 567120 bytes in use
と表示された。クライアント数が0から1に増えたので、shipperは無事Redisに接続できたようだ。
indexer(Redisからデータを受け取りDBに書き込む役割)を立ち上げる
Centralized Setup with Event Parsingの例は、DB(ElasticSearch)を別途インストールせよ、と書いてある。が、今回は簡易テストなので、logstashにバンドルされているElasticSearchを使うことにする。
$ cd /opt/logstash
$ vi indexer.conf
input {
  redis {
    host => "127.0.0.1"
    type => "redis-input"
    data_type => "list"
    key => "logstash"
    message_format => "json_event"
  }
}

output {
  stdout { debug => true debug_format => "json"}

  elasticsearch {
     embedded => true
#    host => "127.0.0.1"
  }
}
起動スクリプトを書く。
$ vi indexer.sh
java -jar logstash-1.1.1-monolithic.jar agent -f indexer.conf
起動してみる。
$ chmod +x indexer.sh
$ ./indexer.sh
すると、Redisの標準出力に
[27291] 12 Sep 13:00:29 - 2 clients connected (0 slaves), 567120 bytes in use
と表示された。クライアント数が2に増えたので、indexerも無事Redisに接続できたようだ。

この状態で、ブラウザでApacheに適当にアクセスしてみる。
すると、indexerの標準出力に

{"@source":"file://server/var/log/httpd/access_log","@type":"apa
che","@tags":[],"@fields":{"clientip":["xx.xx.xx.xxx"],"ident":[
"-"],"auth":["-"],"timestamp":["12/Sep/2012:13:01:32 +0900"],"ZO
NE":["+0900"],"verb":["GET"],"request":["/images/true.png"],"htt
pversion":["1.1"],"response":["200"],"bytes":["248"],"referrer":
["http://server/themes/farend_basic/stylesheets/application.css?
1279358964"],"agent":["\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:
15.0) Gecko/20100101 Firefox/15.0.1\""]},"@timestamp":"2012-09-1
2T04:01:32.889000Z","@source_host":"server","@source_path":"/var
/log/httpd/access_log","@message":"xx.xx.xx.xxx - - [12/Sep/2012
:13:01:32 +0900] \"GET /images/true.png HTTP/1.1\" 200 248 \"htt
p://server/themes/farend_basic/stylesheets/application.css?12793
58964\" \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/201
00101 Firefox/15.0.1\""}
と表示された。どうやらうまく動いていそうだ。
Web GUIを起動する
最後に、ログ検索用のWeb GUIを起動する。
起動スクリプトを書く。
$ cd /opt/logstash
$ vi web.sh
java -jar logstash-1.1.1-monolithic.jar web --backend elasticsearch:///?local
起動してみる。
$ chmod +x web.sh
$ ./web.sh
では、http://server:9292/にアクセスして、適当に検索してみる。
Figure.2 logstash WebUIでのログ検索
検索結果が表示できた!

期待通りにログ収集と検索が実装できたので、今回はここまで。

0 コメント:

コメントを投稿