logstash

提供: FreeBSD入門
移動: 案内検索
スポンサーリンク

logstash とは、プロセスのログやいろいろなシステムからのイベントログのデータパイプラインです。

読み方

logstash
ろぐ すたっしゅ

概要

logstashは、

  • input プラグイン
  • filter プラグイン
  • output プラグイン
  • codec プラグイン

のプラグインを実装して、いろいろなイベントや出力先に対応できます。

出力先として elasticsearch を指定できます。

logstash , elasticsearch, kibana を利用して、簡単にログを可視化できます。たとえば、ApacheのアクセスログをウェブUIで簡単に見れます。

インストール

pkgコマンドでインストールする場合

sudo pkg install logstash

apacheのログを取り込む

事前に kibanaelasticsearchを入れておきましょう。

$ sudo pkg install logstash kibana4 elasticsearch
$ sudo service elasticsearch onestart 
$ sudo service kibana onestart

ブラウザで http://localhost:5601/ にアクセスすると kibana にアクセスできます。

logstash-apache.conf

input {
        file {
                path => "/var/log/httpd-access.log"
                start_position => "beginning"
        }
}
 
filter {
        grok {
                patterns_dir => "patterns"
                match => [ "message", "%{IP:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:apache_timestamp}\] \"%{WORD:method} /%{NOTSPACE:request_page} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response} " ]
        }
        date {
                match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
        }
        mutate {
                convert => { "@version" => "integer"  }
                convert => { "http_version" => "integer" }
                convert => { "server_response" => "integer" }
                convert => { "bytes" => "integer" }
        }
}
 
output {
        elasticsearch {
                host => "localhost"
                index => "apache"
                protocol => "http"
        }
        stdout { codec => rubydebug }
}

ログの取り込み

/usr/local/logstash/bin/logstash -f logstash-apache.conf

設定ファイルのテスト

設定ファイルは、--configtest オプションでテストできます。

 $ /usr/local/logstash/bin/logstash --configtest -f logstash-apache.conf
'[DEPRECATED] use `require 'concurrent'` instead of `require 'concurrent_ruby'`
Configuration OK

apacheログのパース

この行で、http version や reponse が分解されるらしいのだけれども、分解されずに、1つの文字列(string)として入ってしまう。

match => { "message" => "%{COMBINEDAPACHELOG}" }
match => [ "message", "%{IP:client_ip} %{USER:ident} %{USER:auth}
\[%{HTTPDATE:apache_timestamp}\] \"%{WORD:method} /%{NOTSPACE:request_page}
HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response} " ]

上の設定だと以下のように分解されます。しかしながら、 NUMBER と指定しているのに、 ダブルクォーテーションで囲まれているため、elasticsearchで文字列として格納されてしまいます。

{
             "message" => "127.0.0.1 - - [27/Sep/2015:14:40:10 +0900] \"GET /pc/ HTTP/1.0\" 301 -",
            "@version" => "1",
          "@timestamp" => "2015-09-27T05:40:11.520Z",
                "host" => "a1.local",
                "path" => "/var/log/httpd-access.log",
           "client_ip" => "127.0.0.1",
               "ident" => "-",
                "auth" => "-",
    "apache_timestamp" => "27/Sep/2015:14:40:10 +0900",
              "method" => "GET",
        "request_page" => "pc/",
        "http_version" => "1.0",
     "server_response" => "301"
}

上では、数値も文字列として扱われてしまっています。これは、filterで変換できます。

mutate {
	convert => { "@version" => "integer"  }
	convert => { "http_version" => "integer" }
	convert => { "server_response" => "integer" }
	convert => { "bytes" => "integer" }
}

filterで文字列として扱われている値を整数(integer)に変換することで以下のようになりました。

{
             "message" => "127.0.0.1 - - [27/Sep/2015:15:00:45 +0900] \"GET /pc/ HTTP/1.1\" 301 -",
            "@version" => 1,
          "@timestamp" => "2015-09-27T06:01:27.180Z",
                "host" => "a1.local",
                "path" => "/var/log/httpd-access.log",
           "client_ip" => "127.0.0.1",
               "ident" => "-",
                "auth" => "-",
    "apache_timestamp" => "27/Sep/2015:15:00:45 +0900",
              "method" => "GET",
        "request_page" => "pc/",
        "http_version" => 1,
     "server_response" => 301
}

kibanaで見る

kibana で見るときは、 index 名は、 apache を指定すれば見られます。

関連項目



スポンサーリンク