端くれプログラマの備忘録 Elasticsearch [Elasticsearch] LogstashでNginxアクセスログをバッチで読み込む

[Elasticsearch] LogstashでNginxアクセスログをバッチで読み込む

今回読み込もうとするNginxのアクセスログは以下の形式。

xxx.xxx.xxx.xxx - - [24/Feb/2016:22:46:17 -0800] 
"GET /images/sample.jpg HTTP/1.1" 200 29160 "http://www.example.com/index.php"
"Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; GT-I9205 Build/JDQ39) AppleWebKit/
534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/10.9.4.728 U3/0.8.0 Mobile Safa
ri/534.30"

設定ファイル

ngnix-import.conf

input {
  stdin { }
}

filter {
  grok {
  match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
  overwrite => [ "message" ]
  }

  mutate {
  convert => ["response", "integer"]
  convert => ["bytes", "integer"]
  convert => ["responsetime", "float"]
  }

  geoip {
  source => "clientip"
  target => "geoip"
  add_tag => [ "nginx-geoip" ]
  }

  date {
  match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
  remove_field => [ "timestamp" ]
  }

  useragent {
  source => "agent"
  }
}

output {
  # stdout { codec => rubydebug }
  elasticsearch { hosts => '127.0.0.1:9200' }
}
$ /opt/logstash/bin/logstash -f nginx-import.conf --configtest
Configuration OK

アクセスログの読み込み

$ /opt/logstash/bin/logstash -f nginx-import.conf < access.log

実際に試してみたら、大きなアクセスログファイルではLogstashが途中終了してしまった。5万行ずつ分割したら、それぞれ最後まで正常に読み込めた。分割すればいいのならそうしようと調べず仕舞いだけど、もしかすると何か設定があるのかもしれない。

参考サイト

NGINX Log Analysis with Elasticsearch, Logstash, and Kibana
http://logz.io/blog/nginx-log-analysis/

Setting up Logstash 1.4.2 to forward Nginx logs to Elasticsearch | Bravo Kernel
http://www.bravo-kernel.com/2014/12/setting-up-logstash-1-4-2-to-forward-nginx-logs-to-elasticsearch/