ubuntu 18.04 + Elasticsearch + kibana + logstash (file+http) + apacheのログ監視

# 0.概要
Kibana + Elasticsearch + Logstashを導入してApacheのログを監視する。

一般的なファイルにアタッチしてログを吸い取る方法から、ネットワーク越しにログを受け取る方法まで。

# 1. Installation

```
$ sudo apt-get install openjdk-8-jdk
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch
$ sudo vi /etc/elasticsearch/elasticsearch.yml
# add configuration
network.host:0.0.0.0
$ sudo vi /etc/elasticsearch/jvm.options
# modify configuration
-Xmx64m
-Xms64m
$ sudo systemctl start elasticsearch
$ systemctl status elasticsearch
$ sudo systemctl enable elasticsearch
$ sudo apt-get install kibana
$ sudo vi /etc/kibana/kibana.yml
server.host: "0.0.0.0"
$ sudo systemctl start kibana
$ systemctl status kibana
$ sudo systemctl enable kibana
$ sudo apt-get install logstash
$ sudo systemctl start logstash
$ systemctl status logstash
$ sudo systemctl enable logstash
```

# 2. Settings

```
$ sudo vim /etc/logstash/conf.d/apache.conf
```

以下を入力

```
input {
  file {
    path=> "/var/log/apache2/access.log"
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "apache"
  }

}
```

再起動

```
$ sudo systemctl restart logstash.service
```
Kibanaを開き、Management->Index Patterns -> Create Index Patternでapacheを追加。
これでログが監視できるようになる。

# 3. Check & Delete

Check

データベースの一覧が返ってくる

```
$ curl http://localhost:9200/_cat/indices?v
```

こんな感じに帰ってくる

```
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   index   YZfpJsZAStOXOSynXNvxpQ   5   1          0            0       868b           868b
yellow open   apache  m5JbbZVITx6q-LxNHKW-TA   5   1        199            0    534.7kb        534.7kb
yellow open   .kibana bngpvzOfRJ2UYLan0WvfYA   1   1          3            0     15.3kb         15.3kb
```

これでIndexを確認して、いらないデータベースは以下の手順で消す。

Delete

```
$ curl -XDELETE localhost:9200/index/type/[INDEX NAME]
```

# 4. Application
このままだと内部のファイルしか可視化できないため、外部からJSON形式でログを送って保存させる。
それにはHTTP Pluginという元から入っているものを使えばよいが、普通にConfigファイルを記述すると競合してしまう。

以下のようにConfigファイルを書けば競合を防ぐことが出来る。

まずApache

```
input {
  file {
    tags => "apache"
    path=> "/var/log/apache2/access.log"
  }
}

filter {
  if "apache" in [tags] {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
}

output {
  if "apache" in [tags]{
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "apache"
    }
  }
}
```

次に外部Json

```
input {
  http {
    tags => "external"
    host=> "0.0.0.0"
    port=> 31000
  }
}

output {
  if "external" in [tags] {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "external"
    }
  }
}
```

もし、内部ループバックによるログしか(内部からしか)受け取らない場合は`127.0.0.1`をhostに指定

後はLogstashを再起動して、以下でログ送信

```
curl -H "content-type: application/json" -XPUT 'http://127.0.0.1:31000/' -d '{
    "user" : "log",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "hello"
}'
```

受信できていれば完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/b7087e51-f7b8-475c-6cf6-87e6369724b4.png)

因みにURLの後もスラッシュを付けてHeaderを指定できる

```
'http://127.0.0.1:31000/[Request_URI]'
```

なのでWebページのクローリング結果等を入れる場合は、WebページのURLをそのまま続けて入れてもよいかもしれない。