Logstashを試してみる(Docker)
今回はLogstashを使ってみます。
こちらも基本的には公式を参考で問題ありません。
Elasticsearch、kibanaの起動はこちらをどうぞ
kozo.hatenablog.jp kozo.hatenablog.jp
ElasticSearch公式
とりあえず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
etc
がjsonに追加されていれば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をつなげて見える化する