yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

Logstash+Elasticsearch+Kibanaを触ってみる

2018-02-11

Logstash+Elasticsearch+Kibana(ELK)を触ってみた。

はじめに:それぞれのツールについてふわっと理解

検索エンジンが〜とか、ログの整形が〜とかいう言葉を使うと猿にはわからないので、以下の言葉でふわっと理解。

  • Logstash:  ログを要素に分解するツール
  • Elasticsearch: Logstashで分解したログの要素をフィルタリングするツール
  • Kibana: Elasticsearchでフィルタリングした結果をグラフとか可視化するツール

やってみる

まずは、手を動かして、「ログをLogstashで取り込んで、Elasticsearchに送って、Kibanaで可視化」という流れをやってみる。
個人的にはLogstashのgrokプラグインの使い方が難しかった。

やりたいこと

やりたいことは、以下のようなログから、数値とキーワードの集計をリアルタイムで実施し、以下のようなダッシュボードをKibanaで作ること。

% tail -f sample_log/sample.log
Feb 11 12:08:21 17 xxx
Feb 11 12:08:31 68 bbb
Feb 11 12:08:41 62 ccc

環境づくり

まずは、ELKの環境準備。Macに直接brewでインストールする。
https://logz.io/blog/elk-mac/を参考に構築。

% brew install elasticsearch
% brew install kibana
% brew install logstash

ElasticsearchとKibanaを起動する

% brew services start elasticsearch
% brew services start kibana

起動しているか確認

% brew services list
Name          Status  User     Plist
elasticsearch started hogeee /hogeee/Library/LaunchAgents/homebrew.mxcl.elasticsearch.plist
kibana        started hogeee /hogeee/Library/LaunchAgents/homebrew.mxcl.kibana.plist

Kibanaの設定ファイル編集
/usr/local/etc/kibana/kibana.yml (多分人によってパス違う)の、以下二行のコメントアウト外しておく。

server.port: 5601
elasticsearch.url: "http://localhost:9200"

これでElasticSearchとKibanaは完了。
アクセスできるか確認する。

Elasticsearch: http://localhost:9200

Kibana: http://localhost:5601

Logstashについては後の手順にて起動します。

ログの用意

何か分析するログがなければいけないが、無いので、自分で作る。

% cat log_genelator.sh
export LANG=en_US

while true; do

  d=`date '+%b %e %T'`

  r=`echo $((RANDOM%+101))`

  l=`echo $((RANDOM%+4))`
  h_list=(xxx aaa bbb ccc)
  h=${h_list[$l]}

  echo $d $r $h >> sample_log/sample.log
  echo $d $r $h
  sleep 10

done;

実行。

% sh log_genelator.sh

こんな感じでログがでる。

% tail -f sample_log/sample.log
Feb 11 12:08:21 17 xxx
Feb 11 12:08:31 68 bbb
Feb 11 12:08:41 62 ccc

Logstashの設定

先ほど出したログをLogstashで、Elasticsearchに送れる形に整形する。
logstashの設定ファイルを作る。今回はlogtest.confにするが、場所とファイル名は何でも良い。

結果としては以下の通り。

% cat logstash/conf.d/logtest.conf
input {
  file {
    path => [ "hogeee/sample_log/sample.log" ]
    type => "sample-log"
  }
}

filter {
  if [type] == "sample-log" {

    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{BASE10NUM:syslog_number} %{GREEDYDATA:syslog_message}" }
    }

    syslog_pri { }

    date {
      match => [ "syslog_timestamp", "yyyy-MM-dd-hh:mm:ss", "MMM  d HH:mm:ss" ]
    }

    mutate {
      convert => {
        syslog_number => integer
      }
    }
  }
}

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200"]
    index => "syslog-test"
  }
  stdout { codec => rubydebug }
}

Logstashの設定ファイルは、以下のように、input、filter、outputの3セクションに分かれている。

input {
 #ログの読み込み方を記載する
}
filter {
 #ログの分解の仕方を記載する
}
output {
 #ログの書き出し方を記載する
}

inputについて

pathで、どこにあるログを読み込むか指定。(絶対パスでの記載が必要)
typeの名前は任意の名前、後のfilterセクションで使う。

input {
  file {
    path => [ "hogeee/sample_log/sample.log" ]
    type => "sample-log"
  }
}

filterについて

ここでの肝は、grokプラグイン。ログの内容を後々Elasticsearchで分析するために要素に分類する。

今回は、「Feb 11 12:08:21 17 xxx」のようにログが出るので、
「タイムスタンプ(Feb 11 12:08:21) 数字(17) メッセージ(xxx)」の三要素に分類する。

それぞれの要素は、「%{形式: タグ}」という風に定義づける。
タグの名前は任意の名前。後でKibanaにプロットする時に使う。
形式については、自分でゴリゴリ書くこともできるが、あらかじめ用意された形式を使うのが楽。

あらかじめ用意された形式については、以下リンクを参考にした。
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

もしゴリゴリ書くなら、こちらのツールを使うとgrokの文法チェックができるので便利。
http://grokconstructor.appspot.com/do/match#result

filter {
  if [type] == "sample-log" {

    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{BASE10NUM:syslog_number} %{GREEDYDATA:syslog_message}" }
    }

    syslog_pri { }

    date {
      match => [ "syslog_timestamp", "yyyy-MM-dd-hh:mm:ss", "MMM  d HH:mm:ss" ]
    }

    mutate {
      convert => {
        syslog_number => integer
      }
    }
  }
}

outputについて

Elasticに送るという定義はここで書く。
indexは任意の名前。後でKibanaに取り込む時に使う。

output {
  elasticsearch {
    hosts => ["127.0.0.1:9200"]
    index => "syslog-test"
  }
  stdout { codec => rubydebug }
}

文法チェック

以下コマンドで文法チェックができる。色々出るが、結果として「Configuration OK」が出力されればOK。

% logstash -f logstash/conf.d/logtest.conf --config.test_and_exit

※実施は注意※ Elasticsearchの情報削除

もし今までのデータを削除したい場合は、以下コマンド。
危険コマンドなので注意する。

% curl -XDELETE 'http://localhost:9200/*'
{"acknowledged":true}%

LogstashからElasticsearchにデータを送る

以下コマンドで、Logstashを使ってデータをElasticsearchに送る。
※先ほどkibanaの設定ファイルにElasticsearchのリンクを書いているので、Elasticsearchに送れば、Kibanaにプロットできる。

% logstash -f logstash/conf.d/logtest.conf

色々出た後に、以下のようにデータが取り込めていることを確認できる。
先ほどfilterで指定した、syslog_message、syslog_numberなどのタグの値についても無事取得できている。

{
                    "tags" => [
        [0] "_dateparsefailure"
    ],
        "syslog_timestamp" => "Feb 11 13:55:53",
                "@version" => "1",
         "syslog_facility" => "user-level",
         "syslog_severity" => "notice",
                 "message" => "Feb 11 13:55:53 12 ccc",
                    "type" => "sample-log",
          "syslog_message" => "ccc",
                    "path" => "/hogeee/sample_log/sample.log",
                    "host" => "hogeee",
           "syslog_number" => 12,
              "@timestamp" => 2018-02-11T04:55:53.960Z,
    "syslog_severity_code" => 5,
    "syslog_facility_code" => 1
}
{
                    "tags" => [
        [0] "_dateparsefailure"
    ],
        "syslog_timestamp" => "Feb 11 13:56:03",
                "@version" => "1",
         "syslog_facility" => "user-level",
         "syslog_severity" => "notice",
                 "message" => "Feb 11 13:56:03 35 bbb",
                    "type" => "sample-log",
          "syslog_message" => "bbb",
                    "path" => "/sample_log/sample.log",
                    "host" => "hogeee",
           "syslog_number" => 35,
              "@timestamp" => 2018-02-11T04:56:03.996Z,
    "syslog_severity_code" => 5,
    "syslog_facility_code" => 1
}

Kibanaにデータを取り込む

Kibanaにアクセスし、「Management」タブを開く。
先ほど、Logstashの設定ファイルのindexで指定した、syslog-testをindexに入力する。(アスタリスクについてはワイルドカードなので、今回のケースはあってもなくても良い)

 

次に進んで、@timestampを指定して、「Create index pattern」。

これで、データの取り込みが完了。


Kibanaで可視化する

ここまできたら、Kibanaでデータを料理できる。

「Visualize」タブに移り、新しくグラフを作成する。

先ほど取り込んだ、indexを選択

このように「syslog_number」タグの数をプロットするように設定する、

保存。

「Dashboard」タブに移り、新しくダッシュボードを作成する。

先ほど作ったグラフをプロット。

同様に、「syslog_message」タグのキーワードごとの数を集計するように設定する。

ダッシュボードに追加するとそれっぽくなる。