2012年9月11日火曜日

logstash1.1.1でApacheのログを集めてみる

先日のfluentd+MongoDBに続き、OSSのログ収集&検索ソリューション、logstashを試してみた。
前提と仕様
今回はひとまず、同一サーバ上のApacheのログを収集し検索することを目標とする。
環境はCentOS 5.5。
logstashのインストール
logstash - open source log managementからlogstash-1.1.1-monolithic.jarをダウンロードし、インストールする。といっても、適当なとこにjarを置くだけ。ディレクトリは/opt/logstashにしてみた。
$ cd /opt/logstash/
$ ls
logstash-1.1.1-monolithic.jar
Logstash tutorial @ Dreamforce
Step 6 - real world example + search
にあるapache-elasticsearch.confを参考にして、設定ファイルmylogstash.confを作成。
上記サイトの例は、ncコマンドでapacheのログを食わせる形になっていたが、今回はひとまずスタンドアローンで試せればよいので、ログファイルを直接指定した。また、私の環境では日付のパースがうまくいかなかった(エラーになった)のでコメントアウトした。
$ vi mylogstash.conf
input {
  file {
    type => "apache"
    path => "/var/log/httpd/access_log"
  }
  #tcp { 
  #  type => "apache"
  #  port => 3333
  #} 
}

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

# 2012.09.11 dsp74118 comment-out due to parse error
#  date {
#    type => "apache"
#    timestamp => "dd/MMM/yyyy:HH:mm:ss Z"
#  }
}

output {
  stdout { debug => true debug_format => "json"}
  elasticsearch {
    embedded => true
  }
}
logstashを起動するためのスクリプトを作成。
$ vi start.sh
java -jar logstash-1.1.1-monolithic.jar agent -f mylogstash.conf -- web --backend elasticsearch:///?local
起動してみる。
$ ./start.sh
parse
logfile
thread
remaining
log4j:WARN No appenders could be found for logger (org.elasticsearch.node).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4jのエラーが出た。jarファイルにlog4jの設定ファイルが入っていないのが原因なので、下記のようなlog4j.propertiesを作る。
log4j.rootLogger=INFO,rolling
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%5p [%t] %d{ISO8601} %F (line %L) %m%n
log4j.appender.rolling.File=logs/logstash.log
log4j.appender.rolling.DatePattern=.yyyy-MM-dd.HH-mm-ss
jarコマンドを使って、jarファイルにlog4j.propertiesを格納する。
$ jar -uf logstash-1.1.1-monolithic.jar log4j.properties
再度起動。
$ ./start.sh
parse
logfile
thread
remaining
Log4jのエラーは解消。
ログが収集できるか試す
試しに、その辺のPCのブラウザでApacheにアクセスする。
…
{"@source":"file://server/var/log/httpd/access_log","@type":"apa
che","@tags":[],"@fields":{"clientip":["xx.xx.xx.xx"],"ident":["
-"],"auth":["-"],"timestamp":["11/Sep/2012:13:14:56 +0900"],"ZON
E":["+0900"],"verb":["GET"],"request":["/javascripts/effects.js?
1290948531"],"httpversion":["1.1"],"response":["304"],"referrer"
:["http://server/issues/252"],"agent":["\"Mozilla/5.0 (Windows N
T 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1\""]},"@time
stamp":"2012-09-11T04:25:27.121000Z","@source_host":"server","@s
ource_path":"/var/log/httpd/access_log","@message":"xx.xx.xx.xxx
 - - [11/Sep/2012:13:14:56 +0900] \"GET /javascripts/effects.js?
1290948531 HTTP/1.1\" 304 - \"http://server/issues/252\" \"Mozil
la/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/1
5.0.1\""}
…
logstashが集めたログが標準出力に表示された。
Web GUIでログを検索してみる
次にGUIで見てみる。
ブラウザでhttp://server:9292/にアクセス。
Figure.1 logstashの検索画面
検索画面が出たので、適当に検索キーワードを入力し[Search]をクリック。
Figure.2 検索結果画面
検索結果が表示された。
時刻の範囲指定をしてみる。下記のような感じ。
<検索キーワード> @timestamp:[YYYY-MM-DDTHH:MI:SS TO YYYY-MM-DDTHH:MI:SS]

Figure.3 時刻で絞り込んでみたところ
期待通りの結果が得られた。

次回は他サーバのApacheログも集めてみたい。

0 コメント:

コメントを投稿