td-agent3（Fluentd v1.0）でElasticsearchにログを保存する。2018-03-05

# 内容
[Elasticsearch Output Plugin](https://docs.fluentd.org/v1.0/articles/out_elasticsearch) を参考に、`td-agent3`（`Fluentd v1.0`）で `Elasticsearch` にログを保存する設定をします。

# 準備
* `td-agent3`（`Fluentd v1.0`）のインストールは済んでいるものとします
    * 参考: [Ubuntu 16.04.3 LTSにtd-agent3（Fluentd v1.0）をインストールする](https://qiita.com/abetomo/items/86d5c0ab152a593d9fc7)
* `Elasticsearch` の環境構築などの準備作業が必要になりますが、割愛します

## ログ送信前のElasticsearchの状況
起動したての何もしていないElasticsearchです

```json
$ curl localhost:9200/_aliases?pretty
{
  ".monitoring-es-6-2018.03.05" : {
    "aliases" : { }
  }
}
```

# `fluent-plugin-elasticsearch` のインストール
* `td-agent` をインストールすると、一緒にインストールされるプラグインですが、最新のプラグインを利用するため念のためインストールしておきます
* インストールで使うコマンドは `/opt/td-agent/embedded/bin/fluent-gem` にあります。

## インストール
```
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
Fetching: fluent-plugin-elasticsearch-2.7.0.gem (100%)
Successfully installed fluent-plugin-elasticsearch-2.7.0
Parsing documentation for fluent-plugin-elasticsearch-2.7.0
Installing ri documentation for fluent-plugin-elasticsearch-2.7.0
Done installing documentation for fluent-plugin-elasticsearch after 0 seconds
1 gem installed
```

## 確認
```
$ /opt/td-agent/embedded/bin/fluent-gem list fluent-plugin-elasticsearch

*** LOCAL GEMS ***

fluent-plugin-elasticsearch (2.7.0, 2.4.0)
```

# 設定の例
ApacheのアクセスログをElasticsearchに送る例です。

```conf:/etc/td-agent/td-agent.conf
# <source> についての詳細は割愛
<source>
  @type tail
  path /var/log/apache2/access.log
  tag apache.access
  pos_file /var/log/td-agent/apache-access-log.pos
  format apache2
</source>

# <match> の内容が本題
<match apache.access>
  @type elasticsearch
  host localhost
  port 9200
  index_name apache_access
  type_name apache_access
</match>
```

ドキュメントにあるシンプルな設定で試します

# 動作確認
以上の設定例で `td-agent` を起動してログ（`/var/log/td-agent/td-agent.log`）を確認します。
特に問題がなさそうであれば

```
$ while true; do curl localhost > /dev/null && sleep 30; done
```

などでアクセスログを出力して、Elasticsearchにログがたまっていくか確認します。

# Elasticsearchの状況を確認
## インデックスなど確認
```json
$ curl localhost:9200/_aliases?pretty
{
  "apache_access" : {
    "aliases" : { }
  },
  ".monitoring-es-6-2018.03.05" : {
    "aliases" : { }
  }
}
$ curl localhost:9200/apache_access/_mapping?pretty=true
{
  "apache_access" : {
    "mappings" : {
      "apache_access" : {
        "properties" : {
          "agent" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "code" : {
            "type" : "long"
          },
          "host" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "method" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "path" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "size" : {
            "type" : "long"
          }
        }
      }
    }
  }
}
```

## データの確認
```json
$ curl localhost:9200/apache_access/apache_access/_search?pretty=true
{
  "took" : 58,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 6,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "apache_access",
        "_type" : "apache_access",
        "_id" : "4_Ly9GEBywL1eMvL3Szz",
        "_score" : 1.0,
        "_source" : {
          "host" : "127.0.0.1",
          "user" : null,
          "method" : "GET",
          "path" : "/",
          "code" : 200,
          "size" : 11576,
          "referer" : null,
          "agent" : "curl/7.47.0"
        }
      },
      {
        "_index" : "apache_access",
        "_type" : "apache_access",
        "_id" : "kfLw9GEBywL1eMvLySw8",
        "_score" : 1.0,
        "_source" : {
          "host" : "127.0.0.1",
          "user" : null,
          "method" : "GET",
          "path" : "/",
          "code" : 200,
          "size" : 11576,
          "referer" : null,
          "agent" : "curl/7.47.0"
        }
      },
      {
        "_index" : "apache_access",
        "_type" : "apache_access",
        "_id" : "5PLy9GEBywL1eMvL3Szz",
        "_score" : 1.0,
        "_source" : {
          "host" : "127.0.0.1",
          "user" : null,
          "method" : "GET",
          "path" : "/",
          "code" : 200,
          "size" : 11576,
          "referer" : null,
          "agent" : "curl/7.47.0"
        }
      },
      {
        "_index" : "apache_access",
        "_type" : "apache_access",
        "_id" : "kvLw9GEBywL1eMvLySw8",
        "_score" : 1.0,
        "_source" : {
          "host" : "127.0.0.1",
          "user" : null,
          "method" : "GET",
          "path" : "/",
          "code" : 200,
          "size" : 11576,
          "referer" : null,
          "agent" : "curl/7.47.0"
        }
      },
      {
        "_index" : "apache_access",
        "_type" : "apache_access",
        "_id" : "k_Lw9GEBywL1eMvLySw8",
        "_score" : 1.0,
        "_source" : {
          "host" : "127.0.0.1",
          "user" : null,
          "method" : "GET",
          "path" : "/",
          "code" : 200,
          "size" : 11576,
          "referer" : null,
          "agent" : "curl/7.47.0"
        }
      },
      {
        "_index" : "apache_access",
        "_type" : "apache_access",
        "_id" : "4vLy9GEBywL1eMvL3Szz",
        "_score" : 1.0,
        "_source" : {
          "host" : "127.0.0.1",
          "user" : null,
          "method" : "GET",
          "path" : "/",
          "code" : 200,
          "size" : 11576,
          "referer" : null,
          "agent" : "curl/7.47.0"
        }
      }
    ]
  }
}
```

以降、アクセスログが出力されればどんどんたまっていきます

# まとめ
`td-agent3`（`Fluentd v1.0`）で `Elasticsearch` にログを保存できました。

# その他
## エラーが出た
```
[error]: #0 Permission denied @ rb_sysopen - /var/log/apache2/access.log
```

のようなエラーが出るときはchmodします。

```
$ sudo chmod -R 755 /var/log/apache2/
```

## Install Elasticsearch with Docker
DockerのElasticsearchを使うとお手軽に試せます
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html