td-agentの設定と注意事項

# 作業環境
- OS: Amazon Linux2
- td-agent3(fluentd v1)

# 構成
- Fluentd Client数台
    - いつ入れ替わってもすべてのログを保存したいので、ほぼリアルタイムでServerにログを送って集約させます
- Fluentd Server一台
    - ログの保存時間、コスト、検索の便利さなどを考慮して、一時間ごとにログをS3に転送します
 
# Fluentd Client側のインストールと設定
## インストール
下記のコマンドでtd-agent3をインストールすることができます。

```bash
curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
```

## 設定
設定ファイルはここにあります。
`/etc/td-agent/td-agent.conf`

下記の内容を追加します。

```plaintext
<source>
  @type tail
  format nginx
  tag "nginx.access.#{Socket.gethostname}"
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.access.log.pos
</source>

<source>
  @type tail
  tag "nginx.error.#{Socket.gethostname}"
  path /var/log/nginx/error.log
  pos_file /var/log/td-agent/nginx.error.log.pos

  format multiline
  format_firstline /^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} \[\w+\] (?<pid>\d+).(?<tid>\d+): /
  format1 /^(?<time>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>.*)/
  multiline_flush_interval 3s
</source>

<match nginx.**>
  @type forward
  <buffer tag>
    flush_interval 3s
  </buffer>
  <server>
    host x.x.x.x
    port 24224
  </server>
</match>
```

- source: ログを指定し、tagをつける
- match: tagをマッティングし、収集してきたログを処理する

**※注意点：`#{Socket.gethostname}`でhost名を取得できますが、必ず`""`を付けてください。つけないと単なる文字列として扱われます。**

# Fluentd Server側のインストールと設定

## インストール
下記のコマンドでtd-agent3とプラグインをインストールすることができます。

```bash
curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
td-agent-gem install fluent-plugin-forest
```
**※注意点：`fluent-plugin-s3`が必要だと多くの記事に書いてありますが、td-agentの中にすでに含まれてるのでインストール不要です。もしもう一つの`fluent-plugin-s3`を入れたら必ずアンインストールしてください。複数個存在すればエラーが発生してしまいます。ご注意ください。**

## プラグインの確認方法
td-agentを起動してログで確認できます。
`/var/log/td-agent/td-agent.log`

内容は下記のように。

```plaintext
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-elasticsearch' version '3.5.4'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-kafka' version '0.11.1'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-prometheus' version '1.5.0'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-record-modifier' version '2.0.1'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-rewrite-tag-filter' version '2.2.0'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-s3' version '1.1.11'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-td' version '1.0.0'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-td-monitoring' version '0.2.4'
2019-12-10 11:41:04 +0900 [info]: gem 'fluent-plugin-webhdfs' version '1.2.4'
2019-12-10 11:41:04 +0900 [info]: gem 'fluentd' version '1.7.0'
```

## 設定

```plaintext
<match nginx.**>
  @type forest
  subtype copy
  <template>
    <store>
      @type s3
      aws_key_id YOUR_KEY_ID
      aws_sec_key YOUR_SECRIT_KEY
      s3_bucket BUCKET_NAME
      s3_region REGION
      s3_enpoint s3.ap-northeast-1.amazonaws.com
      path ${tag_parts[0]}/${tag_parts[1]}/%Y%m%d/${tag_parts[1]}.log.${tag_parts[2]}.
      time_slice_format %Y%m%d%H
      <buffer tag,time>
        @type file
        path /var/log/td-agent/s3/${tag_parts[0]}/${tag_parts[1]}.log.${tag_parts[2]}
        timekey 3600 # 1 hour partition
        timekey_wait 10s
      </buffer>
    </store>
  </template>
</match>
```

説明：tagがnginx.**のログは一旦buff fileに保存して、1時間ごとにs3に転送します。tagはClient側で設定されます。プラグインforestの使い方はgoogleで検索してください。

**※注意点：bufferのpathですが、サーバごとにログごとに分けてください。分けないとエラーになってログの収集が失敗してしまいます。**

# Debugログの出力方法
デフォルトではエラーログは出ないです。
debugログを出力したい場合は下記の内容を`/etc/td-agent/td-agent.conf`に追加して再起動してください。

```plaintext
<system>
  log_level debug
</system>
```