sakutarou’s blog

とりあえずWeb系技術をゆるく書いていく

Logstashを試してみる(Docker)

今回はLogstashを使ってみます。
こちらも基本的には公式を参考で問題ありません。

Elasticsearch、kibanaの起動はこちらをどうぞ

kozo.hatenablog.jp kozo.hatenablog.jp

ElasticSearch公式

www.elastic.co

とりあえずLogstash起動

イメージ取得 + イメージ名変更

docker pull docker.elastic.co/logstash/logstash:6.4.1
docker tag {取得したイメージID} logstash:6.4.1

起動

マウントしているディレクトリは、piplineの設定ファイルを配置する場所になります。

docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1

Successfully started Logstash API endpoint {:port=>9600} が表示されれば起動完了
ここまで来たら一旦止めちゃいましょう。

piplineの設定ファイル

Logstashの役割は、大枠以下になります。

  • ログファイルなどを受け付ける
  • 受け付けたデータを加工・整形などをする
  • Elasticsearchなどに受け渡す

piplineの設定ファイルを利用して、この一連の流れを設定します。

piplineサンプル

最小の設定ファイルになります。
この設定ファイルだと、「標準入力を受け付けて、受け付けてデータを標準出力に出力する」になります。

logstash.conf など適当なファイル名をつけて、 docker run 実行時にマウントするディレクトリに入れておきます。

input {
    stdin {}
}

output {
    stdout {}
}

もう一度Logstash起動

/logstash が↑で作成した、pipline設定ファイルを設置する場所になります。
(※パスはどこでも構いません)

docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1

Successfully started Logstash API endpoint {:port=>9600} 先ほど同様このメッセージが出れば起動完了。
Logstashが動いてるか確認しましょう。

piplineの設定は、「標準入力を受け付けて、標準出力に出力する」になってますので、適 "hoge" とか適当に週力しましょう。 以下のようなに、 messageに入力した文字列が表示されたjsonが出力されれば正常に動いてます。

{
    "message" => "hoge",
    "@version" => "1",
    "@timestamp" => 2018-09-20T06:31:10.197Z,
    "host" => "593b6a912f8e"
}

piplineに追記

ここまで、データを受け付けて、出力する最低限が設定されてます。
次は変換を行います。

message正規表現を書いて、「入力があったデータを解析・変換を行ってデータを渡す」フィルターをを行います。

%{IPORHOST:clientip} は定義済みのIPORHOST という正規表現に一致するデータを clientip という名前をつけるという内容になります。
定義済み正規表現は以下にあります。

logstash-patterns-core/grok-patterns at master · logstash-plugins/logstash-patterns-core · GitHub

input {
    stdin {}
}

filter {
  grok {
    match => {
      "message" => '%{IPORHOST:clientip} %{GREEDYDATA:etc}'
    }
  }
}

output {
    stdout {}
}

もう一度Logstash起動

docker run --rm -it --name=logstash -v /logstash:/usr/share/logstash/pipeline/ --add-host=elasticsearch:172.17.0.2 logstash:6.4.1

起動したらアクセスログを入力してみる

172.17.0.3 - - [19/Sep/2018:11:44:23 +0900] "GET /index.php HTTP/1.1" 200 12345

clientip etcjsonに追加されていればOKです。

{
      "@version" => "1",
    "@timestamp" => 2018-09-20T13:33:32.662Z,
       "message" => "172.17.0.3 - - [19/Sep/2018 11:44:23 +0900] \"GET /index.php HTTP/1.1\" 200 12345",
      "clientip" => "172.17.0.3",
           "etc" => "- - [19/Sep/2018 11:44:23 +0900] \"GET /index.php HTTP/1.1\" 200 12345",
          "host" => "217da2c6672f"
}

次やること

  • Filebeatを置いて、ElasticSearch、kibana、Logstashをつなげて見える化する