sakutarou’s blog

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

filebeatで準備されてるダッシュボードを利用する

filebeatにはモジュールで利用可能なダッシュボードが準備されている

利用するモジュールを有効化する

利用可能なモジュール一覧

filebeat modules list

モジュール有効化

filebeat modules enable apache2

設定ファイルはこんな感じ

filebeat.modules:
- module: apache2
  access:
    enabled: true
    var.paths: ["/var/log/httpd/access_log*"]
  error:
    enabled: true
    var.paths: ["/var/log/httpd/error_log*"]

ダッシュボードなどの有効化

filebeat setup -e

ダッシュボードなどの有効化(logstashを利用している場合)

logstashを利用している場合はlogstashを一時的に無効化する必要があります。

filebeat setup -E setup.kibana.host=172.17.0.3:5601 -E output.elasticsearch.hosts=['172.17.0.2:9200'] -E output.logstash.enabled=false

これで、 こんな感じの VisualizeDashboard がドバっと使える状態になります

f:id:sakutarou:20180930153127p:plain

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をつなげて見える化する

やっとElasticsearchのクエリーでドキュメントの検索ができた

検索のやり方を備忘録として残しておく
データにはElasticsearchのサンプルデータを利用しています。

www.elastic.co

全文検索クエリ:単語一致

単語単位で検索する場合
RDBのLIKEに近いけどあくまで単語単位での検索

例1) 住所に単語として Street が含まれるドキュメントを検索する

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : "Street"
    }
  }
}'

例2)住所に Elton 又は Street が含まれているドキュメントを検索する(※RDBでいうところのOR検索)

※半角スペースで区切ることで、複数条件での検索になる

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : "Elton Street"
    }
  }
}'

例3)住所に Elton 且つ Street が含まれているドキュメントを検索する(※RDBでいうところのAND検索)

※半角スペースで区切ることで、複数条件での検索になる ※AND検索する場合は、operatorを指定する

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : {
        "query": "Elton Street",
        "operator": "and"
      }
    }
  }
}'

例4) ヒット率での検索

最低N個以上キーワードが含まれていること といったようなRDBにない検索が可能。 minimum_should_match に含まれていてほしい 個数 OR 割合(%) が指定可能である

以下の場合は Elton Street Putnam Place Rockwell Avenue のうち2個以上含まれている結果が取得できる

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "address" : {
        "query": "Elton Street Putnam Place Rockwell Avenue",
        "minimum_should_match": 2
      }
    }
  }
}'

Termクエリ

Termクエリ

Termクエリはkeyword型に対して検索を行う。

ドキュメント格納時
  • text型はアナライザが単語分割を行って転置インデクスを構築する
  • keyword型はドキュメントにそのまま格納される

検索

  • text型は転置インデクスを利用して検索が行われる
  • keyword型は格納されたドキュメントと検索キーワードを直接比較する

また、termクエリは格納されている文字列と完全一致するものを検索する(大文字・小文字も含めて比較する)

例)

curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "term": {
      "address": "171 Putnam Avenue"
    }
  }
}'

Elasticsearchのdate型でInvalid format言われた場合の対処方法

こんな感じのマッピングを作成して、 accesstime2018/08/16 19:00:00 のような日時を入れたら Invalid format 言われた場合 format を指定したら解決
elasticsearch的にこの方法がいいのかは検討する必要あるけど、とりあえず今はこれでOK

修正前

curl -XPUT "http://172.17.0.2:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "my_type": {
      "properties" : {
        "host": {"type":"keyword"},
        "method": {"type":"keyword"},
        "accesstime": {"type": "date"}
      }
    }
  }
}'

修正後

curl -XPUT "http://172.17.0.2:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "my_type": {
      "properties" : {
        "host": {"type":"keyword"},
        "method": {"type":"keyword"},
        "accesstime": {
          "type": "date",
          "format": "yyyy/MM/dd HH:mm:ss"
        }
      }
    }
  }
}'

kibanaを起動する(Docker)

今回はkibanaを起動してみます。
kibanaも基本的には公式を参考とすれば問題ありません。

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

kozo.hatenablog.jp

www.elastic.co

Dockerイメージを取得

docker pull docker.elastic.co/kibana/kibana:6.3.2

イメージ名を変更する

前回同様、イメージ名が長すぎて使いづらいのでイメージ名を変更します。

docker tag {取得したイメージID} kibana:6.3.2

# 変更前は削除
docker rmi docker.elastic.co/kibana/kibana:6.3.2

起動

kibanaを起動します。
ELASTICSEARCH_URL にはElasticsearchのURLを指定します。
※Elasticsearchの起動時に名前を指定しておいた方がよさそうですね

 docker run -p 5601:5601 -e "ELASTICSEARCH_URL=http://IPアドレス:9200" kibana:6.3.2

アクセス

kibanaにアクセスします。
IPアドレスにはdockerホストのアドレスを指定します。

http://IPアドレス:5601

こんな画面が出ればOK!
f:id:sakutarou:20180729231749p:plain

とりあえずここまで!

PHPStormでファイル名検索ができなくなったらすること

たまーにPHPStromでファイル名検索しようとすると検索候補として何も表示されない(ログとか一部なぜか表示される)状況に悩まされていたけど解決したので残しておきます。

メニューから以下を実行

[ファイル]-[キャッシュの破棄/再起動]-[破棄して再起動]
※日本語化してあります

再起動後通常通り検索できるはず!