Fluentdの設定調査

## メモ

**@が必要なシステムパラメータ**

@type，@id，@label，@log_levelはプラグイン本体の設定ではなくて
Fluentdコアの設定なので@をつける。

**format指定**

format による指定は古い設定方法。
v1.0からparse プラグインとして 内で指定することが推奨されている。

例)
古い設定方法

```
<source>
  @type tail
  path /var/log/httpd-access.log
  pos_file /var/log/td-agent/httpd-access.log.pos
  tag apache.access
  format apache2
</source>
```

推奨されている設定方法

```
<source>
  @type tail
  path /var/log/httpd-access.log
  pos_file /var/log/td-agent/httpd-access.log.pos
  tag apache.access
  <parse>
    @type apache2
  </parse>
</source>
```

**type_name**

type_nameは「_doc」固定

```
type_name _doc
```

[Fluent-plugin-elasticsearch v2.8.0対応でわかったElasticsearch 6.0以降の動向](https://www.clear-code.com/blog/2018/3/7.html)
[Elasticsearch, Kibanaを6.7.1から7.1.1にupgradeした](https://wyukawa.hatenablog.com/entry/2019/07/03/162511)

**format none**

ログの行をそのまま "message" key の値として取り込む場合に指定する

**ホスト名を付与**

詳細は、[Fluentdのレコードにホスト名を付与する最良の方法](http://y-ken.hatenablog.com/entry/how-to-add-hostname-fluentd)

```
<filter *.*>
  @type record_transformer
  <record>
    host ${hostname}
  </record>
</filter>
```

**入力データの特定フィールドの値を変更**

[record_transformer](https://docs.fluentd.org/filter/record_transformer)
[fluentd の filter_record_transformer プラグイン便利っぽい](https://www.blogaomu.com/entry/fluentd-filter_record_transformer)
[Fluentd (td-agent) でレコードの値を書き換える方法](http://everything-you-do-is-practice.blogspot.com/2017/12/fluentd-td-agent.html)
[fluentdで送信recordに文字列を代入してから送信する](https://ogugu.hateblo.jp/entry/2019/01/21/151546)
[fluentdのrecord_transformerでログを加工する](https://www.sambaiz.net/article/55/)
[続・fluentdでつくる監視系](https://qiita.com/kotatsu360/items/937d12e5aebfaec0f1fc)

**Fluentdのレコードに環境変数を付与**

例) 環境変数名「COMPUTERNAME」

```
<filter *.*>
  @type record_transformer
  <record>
    computer_name "#{ENV['COMPUTERNAME']}"
  </record>
</filter>
```

Kubernetesの場合、マニュフェストファイルのenvに以下のように
記載すると、Node名、Pod名、PodのIP、Podのサービスアカウントが
環境変数として使用できます。

```      
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
```

**複数行ログ**

in_tailのformatオプションにmultilineを指定することで複数行モードになる
今まで外部プラグイン(fluent-plugin-tail-multiline)として提供されていた機能が、
Fluentd v0.10.45でマージされている。

[Fluentdのin_tailプラグインで複数行のログをよむ方法](http://kazegusuri.hateblo.jp/entry/2014/06/28/201239)
[複数行のログをキーワード監視＆通知することで運用を少し改善しよう](https://qiita.com/uzresk/items/935baa47f83921158276)

**ログファイルの中に複数のフォーマットがある時に利用可能なパーサプラグイン**

[fluent-plugin-multi-format-parser](http://repeatedly.github.io/ja/2014/07/release-fluent-plugin-multi-format-parser/)

## uwsgi(ユーウィズギー)

```
<source>
  @type tail
  path /var/log/foo/bar.log
  pos_file /var/log/td-agent/foo-bar.log.pos
  tag foo.bar
  format /^\[(?<meta>[^\]]*)\] (?<host>[^ ]*) \(\) {[^}]*} \[(?<time>[^\]]*)\] (?<method>\S+) (?<path>[^ ]+) => generated (?<bytes>[^ ]*) bytes in (?<response_time>[^ ]*) msecs \(HTTP\/*.* (?<code>[^ ]*)\) .*$/
</source>
```
Fluentularで確認

![uwsgi.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/701fe638-7a86-de51-1dfd-a582ce83be27.png)

## Mroonga(むるんが)

**Mroongaログ**

[Groonga ログ](http://groonga.org/ja/docs/reference/log.html)

ログフォーマット

```
#{TIME_STAMP}|#{L}| #{MESSAGE}
```

```
<source>
  @type tail
  path /var/log/foo/bar.log
  pos_file /var/log/td-agent/foo-bar.log.pos
  tag foo.bar
  format /^(?<timestamp>[^\|]+)\|(?<log-level>[^\|]*)\|(?<pid>[^\|]*)\|(?<message>[^\|]*)?$/
</source>
```

**Mroongaクエリーログ**

[Groonga ログ](http://groonga.org/ja/docs/reference/log.html)

ログフォーマット

```
#{TIME_STAMP}|#{MESSAGE}
#{TIME_STAMP}|#{ID}|>#{QUERY}
#{TIME_STAMP}|#{ID}|:#{ELAPSED_TIME} #{PROGRESS}
#{TIME_STAMP}|#{ID}|<#{ELAPSED_TIME} #{RETURN_CODE}
```

TestString

```
2011-07-05 06:25:19.458752|test message
2011-07-05 06:25:19.458756|45ea3034|>select Properties --limit 0
2011-07-05 06:25:19.458829|45ea3034|:000000000072779 select(19)
2011-07-05 06:25:19.458875|45ea3034|<000000000119062 rc=0
```

まだ動作未確認

```
<parse>
  @type multiline
  format_firstline /(?<date>[^\|]+)\|(?<message>[^\|]*)?/
  format1 /(?<date>[^\|]+)\|(?<process-id>[^\|]*)\|\>(?<query>[^\|]*)?/
  format2 /(?<date>[^\|]+)\|(?<process-id>[^\|]*)\|\:(?<elapsed-time>[^\|]*)\s(?<progress>[^\|]*)?/
  format3 /(?<date>[^\|]+)\|(?<process-id>[^\|]*)\|\<(?<elapsed-time>[^\|]*)\src\=(?<retrun-code>[^ ]*)?/
</parse>
```

## Maxscale

Regular Expression

```
(?<date>[^]]+)\s\s\s(?<log-level>[^\]]*):\s(?<message>[^\|]*)?
```

Test String

```
2018-12-17 23:20:00   warning: Protocol module 'mysqlbackend' has been deprecated, use 'mariadbbackend' instead.
```

Configuration・・・Fluentularの出力結果

```
<source>
  type tail
  path /var/log/foo/bar.log
  pos_file /var/log/td-agent/foo-bar.log.pos
  tag foo.bar
  format /(?<date>[^]]+)\s\s\s(?<log-level>[^\]]*):\s(?<message>[^\|]*)?/
</source>
```

## JSON文字列

Regular Expression

```
\{\s[^ ]*\s(?<UserId>[^ ]*),\s[^ ]*\s(?<UserToken>[^ ]*),\s[^ ]*\s(?<SecurityCode>[^ ]*),\s[^ ]*\s(?<Password>[^ ]*),\s[^ ]*\s(?<UserPhone>[^ ]*),\s[^ ]*\s(?<drop>[^ ]*)\s[^ ]*\s(?<UserLastName>[^ ]*)\s\}
```

TestString

```
{ "UserId": "3", "UserToken": "4578965235874158", "SecurityCode": "111", "Password": "12345", "UserPhone": "555-555-1531", "drop": "-1", "UserLastName": "Smith" }
```

Configuration・・・Fluentularの出力結果

```
<source>
  type tail
  path /var/log/foo/bar.log
  pos_file /var/log/td-agent/foo-bar.log.pos
  tag foo.bar
  format /\{\s[^ ]*\s(?<UserId>[^ ]*),\s[^ ]*\s(?<UserToken>[^ ]*),\s[^ ]*\s(?<SecurityCode>[^ ]*),\s[^ ]*\s(?<Password>[^ ]*),\s[^ ]*\s(?<UserPhone>[^ ]*),\s[^ ]*\s(?<drop>[^ ]*)\s[^ ]*\s(?<UserLastName>[^ ]*)\s\}/
</source>
```

---
## 参考URL

[Fluentdで複数行のログを読む](https://kazuhira-r.hatenablog.com/entry/2021/01/28/000628)