「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 { | ||
− | + | 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 { | 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のログを取り込む
事前に kibanaとelasticsearchを入れておきましょう。
$ 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 を指定すれば見られます。