Elasticsearch + Kibana + Logstash + Filebeat でシスログ監視 [7.x]

<img width="1433" alt="スクリーンショット 2019-08-12 0.34.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/931d0b4a-d29e-07a5-43ce-66e76ccbfe20.png">

## 概要

シスログ監視をElasticsearch + Kibana + + Logstash + Filebeat を一括で行って見た際の実行ログ

## 公式リンク

[ELASTIC STACKについて](https://www.elastic.co/jp/products/)

Wikiより

``` :wiki
ElasticsearchはLucene基盤の分散処理マルチテナント対応検索エンジンである。
オープンソースソフトウェアだが、現在はオランダ・アムステルダムに本社を置くElastic社が中心になって開発が進められている[1]。
なお「Elastic Search」といったように間に空白を入れる・「search」の頭を大文字にするといった表記は誤り
（ただしVer.1.0.0リリース前にはそのような表記も混在していた）
```

各ソフトウェアについての概要と実装言語

|beats|概要|言語|
------|---|----
elasticsearch|分散型RESTful検索エンジン|Java
kibana|ブラウザーベースの分析および検索ダッシュボード|JavaScript
Filebeat|ログファイルの収集|Go
Metricbeat|CPU,メモリ等の情報収集|Go
Packetbeat|パケット情報の収集|Go
Winlogbeat|Windowsのイベントログの収集|Go
Auditbeat|監査データの収集|Go
Heartbeat|リモートから稼働状況の監視|Go
logstash|サーバー側のデータ処理パイプライン|Ruby

## 簡単な用語まとめ

|beats|概要|参考|
------|---|----
cluster|同一の名前を持つnodeの集合
index|RDBにおけるデータベース
type|RDBにおけるテーブル
field|RDBにおけるカラム
document|RDBにおけるレコード
mapping|RDBにおけるスキーマ定義
node|elasticsearchインスタンスを実行している単位

## 環境

``` bash
$ uname -r
3.10.0-957.el7.x86_64

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```

## デフォルトポート

今回は下記のように設定しています。
既に使用済みの場合は適宜変更してください

|プロセス|ポート番号|
-------|--------
Elastisearch|9200
Kibana|5201
Logstash|5044

構築するイメージ

<img width="953" alt="スクリーンショット 2019-08-14 15.41.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/8c52e86d-0bf9-eb63-583a-f1c3e498e690.png">

## インストール前準備

``` bash
# Javaインストール
$ yum search java-1.8.0-openjdk
$ yum -y install java-1.8.0-openjdk
$ export JAVA_HOME=/usr/bin/java

# リポジトリ登録
$ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

## インストール

#### Elasticsearchインストール

GitHub : [elastic/elasticsearch](https://github.com/elastic/elasticsearch)

``` bash
# インストール
$ yum install -y elasticsearch

# 外部からアクセスできるように設定
$ vim /etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0
http.port: 9200

# Elasticsearch起動/確認
$ systemctl enable elasticsearch.service
$ systemctl start elasticsearch.service
$ systemctl status elasticsearch.service
$ curl [IPアドレス]:9200

```

#### Kibanaインストール

GitHub : [elastic/kibana](https://github.com/elastic/kibana)

``` bash
# インストール
$ yum install -y kibana

# 外部からアクセスできるように設定
$ vim /etc/kibana/kibana.yml
server.host: "[IPアドレス]"

# Kibana起動/確認
$ systemctl enable kibana.service
$ systemctl start kibana.service
$ systemctl status kibana.service
$ curl -XGET 'http://[IPアドレス]:9200/filebeat-*/_search?pretty'
```

#### Logstashインストール

[elastic/logstash](https://github.com/elastic/logstash)

``` bash
# インストール
$ yum -y install logstash

# フィルター用のファイルを作成
$ vim /etc/logstash/conf.d/01-syslog.conf
input {
  beats {
    port => "5044"
    type => "beats"
    }
}

output {
  elasticsearch {
    hosts => ["[IPアドレス]9200"]
    index => "squid-%{+YYYY.MM}"
  }
}

# サービス起動/確認
$ systemctl start logstash
$ systemctl status logstash

# ログを監視
tail -f /var/log/logstash/logstash-plain.log
```

#### Filebeatインストール (監視対象ノード)

GitHub : [elastic/beats/filebeat](https://github.com/elastic/beats/tree/master/filebeat)

``` bash
# インストール
$ yum -y install filebeat

# syslogを収集するように設定
$ vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: syslog
  protocol.udp:
    host: "192.168.1.238:9000"

- type: log
  enabled: false
  paths:
    - /var/log/messages

# Kibana連携
$ vim /etc/kibana/kibana.yml
setup.kibana:
  host: "[IPアドレス]:5601"

# Elasticsearch連携
$ vim /etc/kibana/kibana.yml
output.elasticsearch:
  hosts: ["[IPアドレス]:9200"]

# 実行
$ filebeat setup
$ systemctl start filebeat
```

#### Metricbeat

[elastic/beats/metricbeat](https://github.com/elastic/beats/tree/master/metricbeat)

``` bash
# インストール
$ yum -y install metricbeat

# 設定ファイル編集
setup.kibana:
  host: "[IPアドレス]:5601"
output.elasticsearch:
  hosts: ["[IPアドレス]:9200"]

# 実行
$ metricbeat setup
$ systemctl start metricbeat
$ systemctl status metricbeat
```

## logを送信してみる

動作確認するためのコマンドです。

``` bash
# ログファイルへ追記する
$ logger "test log"

# pingでネットワーク通信を実行
$ ping -s 1M 192.168.179.10
```

上記実行後にKibanaからログが見れれば動作成功。

## イメージ

#### メトリクス

<img width="1435" alt="スクリーンショット 2019-08-12 23.12.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/b47bb188-7780-a348-e1bc-7faf8d5d78ec.png">

#### ログ検索

<img width="1434" alt="スクリーンショット 2019-08-12 23.12.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/67c878c3-8650-560c-2443-90c3c6f277e9.png">

## apacheモジュール

beatにあるapacheモジュールを使うことでアクセスログやアクセス元の地域を可視化することができます。
また、ブラウザの種類やアクセス数なども特別な設定をせずにみることもできます。

``` bash
# モジュールを有効化
$ filebeat modules enable apache2

# モジュールリストを表示
$ filebeat modules list

# 設定ファイル
$ vim /etc/filebeat/modules.d/apache2.yml
- module: apache2
  # Access logs
  access:
    enabled: true
    var.paths:
      - /var/log/httpd/access_log

  # Error logs
  error:
    enabled: true
    var.paths:
      - /var/log/httpd/error_log

# サービス再起動
$ systemctl restart filebeat
```

<img width="1426" alt="スクリーンショット 2019-08-14 14.49.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/0554a43f-332a-3da8-a4ff-356f9d3ed1a2.png">

## Index Lifecycle Policies

ここまでの設定のままだとログが無限に溜まってく一方です。
そこで削除するようなライフサイクルポリシーを定義します。

kibanaを開き Management > Index Lifecycle Policies > Create Policyを選択
ここで「Hot phase」、「Warm phase」、「Cold phase」、「Delete phase」とあります。
詳しい説明は下記をご参照ください。
ここでは削除までの定義としてDelete phaseに下記のように設定します。

[Optimizing Elasticsearch – Part 2: Index Lifecycle Management](https://blog.nviso.be/2019/06/17/optimizing-elasticsearch-part-2-index-lifecycle-management/)

<img width="936" alt="スクリーンショット 2019-08-17 18.20.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/571eba28-55a1-8aae-c7ee-bd250f78b753.png">

上記の意味は4日前に作成されたインデックスを削除するといった意味です。
そのあとは1階層上へ戻り下記のように選択します。
そこでmetricbeatのログやfilebeatのログなどこのポリシーを適用したいログを選択してください。

<img width="840" alt="スクリーンショット 2019-08-17 18.21.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/adccb8e2-2b95-fddf-0f58-cc825740f0a5.png">


## 参考記事

[はじめての Elasticsearch](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)
[Filebeat にモジュール機能が追加され、ログ可視化が簡単になりました ](https://dev.classmethod.jp/server-side/elasticsearch/released-filebeat-modules-apache/)
[Kibanaで簡単! サクサク ビジュアライズしよう！](https://qiita.com/kitfactory/items/9c2f990d87e33fab828a)
[Filebeatの性能チューニングポイントまとめ]()

## 参考スライド

[アプリケーション(パフォーマンス) 監視入門 - Elastic編](https://noti.st/johtani/eJPLbZ/slides)
[ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ](https://www.slideshare.net/y-ken/elasticsearch-kibnana-fluentd-management-tips)