3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Elastic Stack を Docker で構築し IIS ログを分析する

Last updated at Posted at 2020-12-22

はじめに

Elasticsearch アドベントカレンダー(2020年)の23日目の記事です。
IIS ログをエクセルに張り付けてピボットテーブルを作成しピボットグラフにする原始的な作業をもうやりたくないので Elastic Stack を構築してみたところ簡単に分析出来るようになったので記事に起こしました。

目次

各ソフトウェア概要

elkb.png

  • Elastic Stack は Elasticsearch,Kibana,Beats,Logstash からなるプロダクト群の総称です。
  • Beats はデータシッパーと呼ばれ,データ転送ツールとして用いられます。
    • 自動でファイルの更新を検知し差分を転送してくれます。
    • 今回は Filebeats を使用します。
  • Logstash はデータ処理パイプラインと呼ばれ,データを取り込み,変換し Elasticsearch に格納することが出来ます。
  • Elasticsearch は言わずと知れた全文検索エンジンです。データ投入時に内部で転置インデックスを作成することで大量のドキュメントを高速に検索出来るようにしてます。
  • Kibana は Elasticsearch のデータを可視化するツールとして用いられます。

処理フロー

  • 処理フローは [Filebeat -> Logstash -> Elasticsearch -> Kibana]
  • Filebeat で IIS ログを監視し,更新を検知したら Logstash に転送します。
  • Logstash で json に変換し,Elasticsearch に投入します。
  • Kibana で Elasticsearch のデータを可視化します。

Docker Compose で Elastic Stack を構築する

Docker Compose で構築します。  
docker-compose.yml があるディレクトリで docker-compose up -d でコンテナを起動します。

> docker-compose up -d

構成

  • ./filebeat/log に IIS ログを格納します。
    • コンテナが起動していれば自動で Elasticsearch に投入されます。
.
├─docker-compose.yml
├─.env
├─elasticsearch
│  └─data
├─filebeat
│  ├─conf
│  │  └─filebeat.yml
│  └─log
│      └─u_exyyyymmdd.log
└─logstash
    └─pipeline
        └─logstash.conf

docker-compose.yml

  • Elasticsearch,Kibana,Logstash,Filebeat を構築します。
  • Elasticsearch はシングルノードで構築します。
  • Elasticsearch のデータを保持できるようボリュームをローカルにマウントします。
    • Kibana で作成したグラフやダッシュボードもここに格納されます。
  • Logstash ではローカルの設定ファイルを読み込みます。
  • Filebeat ではローカルの設定ファイルを読みこみます。
  • Filebeat でローカルのログを参照できるようにボリュームをマウントします。
  • Filebeat で Docker のソケットを参照するらしいのでマウントします。
version: "3"

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms4096m -Xmx4096m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
  kibana:
    image: docker.elastic.co/kibana/kibana:7.2.0
    ports:
      - 5601:5601
  logstash:
    image: docker.elastic.co/logstash/logstash:7.2.0
    ports:
      - 5044:5044
    environment:
      - "LS_JAVA_OPTS=-Xms4096m -Xmx4096m"
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
  filebeat:
    image: docker.elastic.co/beats/filebeat:7.2.0
    volumes:
      - ./filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - ./filebeat/log:/usr/share/filebeat/log
      - /var/run/docker.sock:/var/run/docker.sock
    user: root

.env

Docker for Windows で /var/run/docker.sock をマウント出来るようにします。

COMPOSE_CONVERT_WINDOWS_PATHS=1

logstash.conf

  • Filebeat からの転送を受け付けるように input を設定します。
  • IIS ログを加工します。
  • Elasticsearch に投入出来るよう output を設定します。
input {
# input from Filebeat
  beats {
    port => 5044
  }
}

filter {
  dissect {
  # log format is TSV
    mapping => {
      "message" => "%{ts} %{+ts} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs(User-Agent)} %{cs(Referer)} %{sc-status} %{sc-substatus} %{sc-win32-status} %{time-taken}"
    }
  }
  date {
    match => ["ts", "YYYY-MM-dd HH:mm:ss"]
    timezone => "UTC"
  }
  ruby {
    code => "event.set('[@metadata][local_time]',event.get('[@timestamp]').time.localtime.strftime('%Y-%m-%d'))"
  }
  mutate {
    convert => { 
      "sc-bytes" => "integer"
      "cs-bytes" => "integer"
      "time-taken" => "integer"
    }
    remove_field => "message"
  }
}

output {
  elasticsearch { 
    hosts    => [ 'elasticsearch' ]
    index => "iislog-%{[@metadata][local_time]}" 
  }
}

filebeat.yml

  • /usr/share/filebeat/log を参照するように input を設定します。
    • 実際は ./filebeat/log を /usr/share/filebeat/log にマウントしているので ./filebeat/log に IIS ログを格納すれば Filebeat が自動で参照します。
  • Logstash に転送するよう output を設定します。
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/log/*.log
  exclude_lines: ['^#','HealthChecker']
  
output.logstash:
  hosts: ["logstash:5044"]

IIS ログファイルを置く

IIS ログファイルを ./filebeat/log に置くと Filebeat がそれを検知し Logstash に送信します。
送信されたデータは Logstash で加工され,Elasticsearch に投入されます。

Kibana で可視化する

Elasticsearch の Index 確認

http://localhost:5601 にアクセスします。

00.png

歯車アイコンをクリックし,Elasticsearch/Index Management をクリックします。

01.png

IIS ログの Index が作成されていることを確認します。

Kibana の Index Pattern 作成

Kibana/Index Patterns をクリックし,Create Index pattern をクリックします。

04.png

Index pattern を入力し Next step をクリックします。

02.png

Time Filter field name で @timestamp を選択し Create index pattern をクリックします。

03.png

ここで作成した Index pattern を選択しグラフを作成していきます。

04.png

グラフ作成

05.png

先ほど作成した Index pattern を指定します。

06.png

右上の表示期間を絞り込みます。

07.png

X 軸を指定します。
Aggregation を Date Histogram,Field を @timestamp,Minimum interval を Minute とし,▷をクリックします。

08.png

これで分間のリクエスト数がグラフに表示されました。
機能ごとの分間リクエスト数を表示するには Add filter をクリックし,Field(フィルターをかけたい項目),Operator(演算子),Value(値) を指定します。

_09.png

_10.png

ダッシュボード作成

作成したグラフをダッシュボードに並べることが出来ます。

_kibana_dashboard.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?