IISのログをelasticsearch+kibanaで可視化しよう


# はじめに
最近仕事で elastic stack (filebeat, logstash, elasticsearch, kibana) を触り始めて、これは素晴らしいと感じたので、実験を兼ねてネタを投稿します。
今回は Windows の記事が少なく感じた(または古い)ので敢えて windows 環境でチャレンジします。linux も勿論 love ですし、仕事で使うなら linux がいいかなと思っております :grinning:
ログは既にある iis のログファイルを使用、ログの取り込みは logstash で行います。
今回はスタンドアロンの環境を想定。どこかでログがあるサーバと、elasticsearch のあるサーバを分ける構成も書けると良いのですが・・・
またチューニング関連は割愛しております。
執筆時点では elastic stack の version は 6.0 だったのですが、書き終わる頃に 6.1 がリリースされています。バージョンアップ早いですね。 

誤りや、こうしたほうが良い点ありましたらコメント頂けると嬉しいです。
# 環境
- windows 10 Pro 1709
- jre8 執筆時点最新 1.8.0_151
- elastic stack 執筆時点最新 (6.0.0) ※ elastic stack は同一バージョン間でテストされているらしいので、バージョンは統一する
    - logstash ログ取り込みに使用
    - elasticsearch 広義でのDB
    - kibana 可視化ツール

# java (jre) install

[logstash のダウンロードページ](https://www.elastic.co/jp/downloads/logstash) に java8 以降が必要とあるのでインストール
[javaのダウンロードページ](https://java.com/ja/download/manual.jsp) から「Windows オフライン (64ビット)」とある現時点最新版の Version 8 Update 151  をダウンロードしインストール
※ 誤って32bit版を入れないように注意!!

# logstash install

[logstashダウンロードページ](https://www.elastic.co/jp/downloads/logstash) から zip 版の logstash-6.0.0.zip をダウンロードし適当なフォルダに展開。
ここでは `C:\home\Program\logstash-6.0.0` に配置

動作確認

```bat
c:\home\Program\logstash-6.0.0\bin>set JAVA_HOME=C:\Program Files\Java\jre1.8.0_151
c:\home\Program\logstash-6.0.0\bin>logstash.bat -h
```

JAVA_HOME は適宜置き換えてください。無いとエラーになりました。
ヘルプが表示されることを確認します。
ワーニングは無視します。
logstash の起動はめっちゃ重いです(jrubyで作られているため？)

# elasticsearch install

[elasticsearchダウンロードページ](https://www.elastic.co/jp/downloads/elasticsearch) から zip 版の elasticsearch-6.0.0.zip をダウンロードして適当なフォルダに展開。
ここでは `C:\home\Program\elasticsearch-6.0.0` に配置

起動

```bat
c:\home\Program\elasticsearch-6.0.0\bin>elasticsearch.bat
```

～started と表示されていればたぶんOKです
念のためブラウザで http://localhost:9200/ にアクセスして下記のようなjson が返ってくることを確認

```json
{
  "name" : "F1Wwq0Q",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "sJOWGl2sTfiLbG-6c5v0iA",
  "version" : {
    "number" : "6.0.0",
    "build_hash" : "8f0685b",
    "build_date" : "2017-11-10T18:41:22.859Z",
    "build_snapshot" : false,
    "lucene_version" : "7.0.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```



# kibana install

[kibanaダウンロードページ](https://www.elastic.co/jp/downloads/kibana) から Windows 版の kibana-6.0.0-windows-x86.zip をダウンロードして適当なフォルダに展開。
ここでは `C:\home\Program\kibana-6.0.0-windows-x86` に配置

起動

```bat
c:\home\Program\kibana-6.0.0-windows-x86_64\bin>kibana.bat
```

ブラウザで http://localhost:5601/ にアクセスして kibana のUI が表示されることを確認

![kibana01.png](https://qiita-image-store.s3.amazonaws.com/0/147687/720e7d63-c34d-a70a-81bd-7ebc42cb6c1b.png)


# log の準備
IISのログは、デフォルトでは`C:\inetpub\logs\LogFiles\W3SVC1`以下に`u_exYYMMDD.log` といったファイル名で保存されています。
余談ですが、フォルダ名はWebSiteのIDになっていたと思います。
ファイルのフォーマットは、IISマネージャにて以下の様になっていることを確認します。

|項目名| 値 |
|:--|:-:|
|ログファイル作成単位|サイト|
|形式|W3C|

![iismgr_log01.png](https://qiita-image-store.s3.amazonaws.com/0/147687/915a0c1a-4e19-2ad0-688c-30023c02184f.png)

ログのフィールドは「フィールドの選択」ボタンを押して、すべての項目にチェックが入っているものとします。

![iismgr_log02.png](https://qiita-image-store.s3.amazonaws.com/0/147687/60e55d52-50d0-1d49-558c-3831dcffb505.png)

変更後は、IISマネージャの右ペインで「適用」をクリックするのをお忘れずに！
デフォルトでは何故かすべての項目にチェックが入っていないのと、IISのバージョンや、ログファイル作成単位によって項目が異なるようです。これが一致していないとログの取り込みに手間が掛かります。もう少し標準化されていると楽なのですが・・・。

# log 取り込み

log は前述した通り logstash を使って elasticsearch に取り込みます。
logstash では、 .yml ファイルを記述して設定を行います。

logstash の基本は、「input」・「filter」・「output」になります。
input では、 iis のログを読み込む。
filter では、ログのフィルタリングとフォーマットの定義を行う。
output では、 elasticsearch に出力します。

設定ファイルは以下の様にしました。 logstash の加工と言えば grok が有名ですが、iis の log はスペース区切りのため簡単な dissect を使ってみました。
また logstash 6.0 目玉機能の一つである pipeline を使ってみました。
pipeline の定義は ver 5 までの conf.d と違い独立するので、取り込むログの種類が増えて if 文だらけになっていたのが解消できるようです

```yaml:pipelines.yml
# 行末に以下を追記
- pipeline.id: iislog
  path.config: "C:\\home\\Program\\logstash-6.0.0\\config\\iislog.cfg"
```

```yaml:iislog.cfg
input {
  stdin {}
}
filter {
  # skip header
  if [message] =~ "^#" {
    drop {}
  }
  dissect {
    mapping => {
      "message" => "%{ts} %{+ts} %{s-sitename} %{s-computername} %{s-ip} %{cs-method} %{cs-uri-stem} %{cs-uri-query} %{s-port} %{cs-username} %{c-ip} %{cs-version} %{cs(User-Agent)} %{cs(Cookie)} %{cs(Referer)} %{cs-host} %{sc-status} %{sc-substatus} %{sc-win32-status} %{sc-bytes} %{cs-bytes} %{time-taken}"
    }
  }
  date {
    match => ["ts", "YYYY-MM-dd HH:mm:ss"]
  }
  mutate {
    convert => { 
      "sc-bytes" => "integer"
      "cs-bytes" => "integer"
      "time-taken" => "integer"
    }
  }
}
output {
  stdout { codec => rubydebug }
#   elasticsearch { index => "iislog-%{+YYYY.MM.dd}"  }
}

```

iislog.cfg は pipeline.yml と同じディレクトリの `C:\home\Program\logstash-6.0.0\config ` に配置してます。

最初は、input は stdin に、output は stdout にして、期待した通りに動作するか確認しましょう。

ポイントとしては、まずはヘッダのスキップ。# で始まる行はヘッダであり取り込み不要のためスキップしています
次に、 dissect で行を各項目に分割します。IIS の log はスペース区切りなので、簡単ですね
あとは、数値項目は mutate で数値型にするのを忘れないように
文字列で elasticsearch に取り込むと、 kibana で可視化する際に平均値をとるなどの演算ができずグラフが描けなくなります。

動作確認は以下の様にしました

```bat
C:\home\Program\logstash-6.0.0\bin>type "C:\inetpub\logs\LogFiles\W3SVC1\u_ex171202.log" | logstash.bat
<<途中省略>>
{
          "cs-method" => "GET",
        "cs-uri-stem" => "/iisstart.png",
       "cs-uri-query" => "-",
       "sc-substatus" => "0",
     "s-computername" => "hogePC",
        "cs-username" => "-",
    "sc-win32-status" => "0",
            "cs-host" => "localhost",
         "cs-version" => "HTTP/1.1",
          "sc-status" => "304",
           "@version" => "1",
               "host" => "hogePC",
     "cs(User-Agent)" => "Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/58.0.3029.110+Safari/537.36+Edge/16.16299",
        "cs(Referer)" => "http://localhost/",
         "cs(Cookie)" => "-",
         "s-sitename" => "W3SVC1",
           "cs-bytes" => 452,
            "message" => "2017-12-02 13:58:20 W3SVC1 hogePC ::1 GET /iisstart.png - 80 - ::1%0 HTTP/1.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/58.0.3029.110+Safari/537.36+Edge/16.16299 - http://localhost/ localhost 304 0 0 93 452 0\r",
         "time-taken" => 0,
         "@timestamp" => 2017-12-02T04:58:20.000Z,
               "s-ip" => "::1",
             "s-port" => "80",
           "sc-bytes" => 93,
               "c-ip" => "::1%0",
                 "ts" => "2017-12-02 13:58:20"
}
[2017-12-14T23:19:23,906][INFO ][logstash.pipeline        ] Pipeline terminated {"pipeline.id"=>"iislog"}
```

期待した通りになったら、output の stdout をコメントアウトし、 elasticsearch のコメントを解除して上記コマンドを再度実行して elasticsearch にログを取り込みます

# kibana で index pattern 作成
kibana の webui で以下の様に index pattern を作成

![kibana02.png](https://qiita-image-store.s3.amazonaws.com/0/147687/065b0931-9896-d829-78b9-92280a89febe.png)

[Create] ボタンを押す 

# kibana でグラフ作成
ぽちぽち(しょぼいですが)

![kibana03.png](https://qiita-image-store.s3.amazonaws.com/0/147687/bbc73f50-be08-5161-2052-9841860ed553.png)