「logstash」の版間の差分

提供: FreeBSD入門
移動: 案内検索
 
行22: 行22:
 
{{pkg|logstash}}
 
{{pkg|logstash}}
 
== apacheのログを取り込む ==
 
== apacheのログを取り込む ==
 +
事前に [[kibana]]と[[elasticsearch]]を入れておきましょう。
 +
<syntaxhighlight lang="bash">
 +
$ sudo pkg install logstash kibana4 elasticsearch
 +
$ sudo service elasticsearch onestart
 +
$ sudo service kibana onestart
 +
</syntaxhighlight>
 +
ブラウザで http://localhost:5601/ にアクセスすると [[kibana]] にアクセスできます。
 
=== logstash-apache.conf ===
 
=== logstash-apache.conf ===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
input {
 
input {
 
         file {
 
         file {
                 path => "/var/log/access.log"
+
                 path => "/var/log/httpd-access.log"
 
                 start_position => "beginning"
 
                 start_position => "beginning"
 
         }
 
         }
行32: 行39:
  
 
filter {
 
filter {
         if [path] =~ "access" {
+
         grok {
                 mutate { replace => { "type" => "apache_access" } }
+
                 patterns_dir => "patterns"
                 grok {
+
                 match => [ "message", "%{IP:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:apache_timestamp}\] \"%{WORD:method} /%{NOTSPACE:request_page} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response} " ]
                        match => { "message" => "%{COMBINEDAPACHELOG}" }
+
                }
+
 
         }
 
         }
 
         date {
 
         date {
 
                 match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
 
                 match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
 +
        }
 +
        mutate {
 +
                convert => { "@version" => "integer"  }
 +
                convert => { "http_version" => "integer" }
 +
                convert => { "server_response" => "integer" }
 +
                convert => { "bytes" => "integer" }
 
         }
 
         }
 
}
 
}
行45: 行56:
 
output {
 
output {
 
         elasticsearch {
 
         elasticsearch {
                 host => localhost
+
                 host => "localhost"
 +
                index => "apache"
 +
                protocol => "http"
 
         }
 
         }
 
         stdout { codec => rubydebug }
 
         stdout { codec => rubydebug }
行61: 行74:
 
Configuration OK
 
Configuration OK
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
== apacheログのパース ==
 +
この行で、http version や reponse が分解されるらしいのだけれども、分解されずに、1つの文字列(string)として入ってしまう。
 +
<syntaxhighlight lang="bash">
 +
match => { "message" => "%{COMBINEDAPACHELOG}" }
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight lang="bash">
 +
match => [ "message", "%{IP:client_ip} %{USER:ident} %{USER:auth}
 +
\[%{HTTPDATE:apache_timestamp}\] \"%{WORD:method} /%{NOTSPACE:request_page}
 +
HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response} " ]
 +
</syntaxhighlight>
 +
上の設定だと以下のように分解されます。しかしながら、 NUMBER と指定しているのに、 ダブルクォーテーションで囲まれているため、[[elasticsearch]]で文字列として格納されてしまいます。
 +
<syntaxhighlight lang="bash">
 +
{
 +
            "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"
 +
}
 +
</syntaxhighlight>
 +
 +
上では、数値も文字列として扱われてしまっています。これは、filterで変換できます。
 +
<syntaxhighlight lang="bash">
 +
mutate {
 +
convert => { "@version" => "integer"  }
 +
convert => { "http_version" => "integer" }
 +
convert => { "server_response" => "integer" }
 +
convert => { "bytes" => "integer" }
 +
}
 +
</syntaxhighlight>
 +
filterで文字列として扱われている値を整数(integer)に変換することで以下のようになりました。
 +
<syntaxhighlight lang="bash">
 +
{
 +
            "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
 +
}
 +
</syntaxhighlight>
 +
=== kibanaで見る ===
 +
[[kibana]] で見るときは、 index 名は、 apache を指定すれば見られます。
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[kibana]]
 
* [[kibana]]

2015年9月27日 (日) 15:11時点における最新版

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 を指定すれば見られます。

関連項目