fluentd + Cloud logging(旧:Stackdriver) でファイル名が固定されていないログを処理する-2

# はじめに
前回の続きです。
https://qiita.com/ys_nishida/items/d9351eb602de42e6a1ab

前回は、以下の課題が残っていました。

1. `pos` ファイルに`unwatch`のログエントリが延々と残ってしまい、`pos`ファイルが肥大化する
2. 処理しているファイル名をタグやラベルに追加する

今回はこれらについて記載していきます。

# `pos`ファイルの肥大化の解消
## 執筆時点での方法（2020年5月時点）
`pos`ファイルにて、`unwatch`になったエントリは、`google-fluentd`を再起動する事で削除されます。
[前回](https://qiita.com/ys_nishida/items/d9351eb602de42e6a1ab) の最後の`pos`ファイルは以下です。

```bash:/var/lib/google-fluentd/pos/my_custom_app.pos 
/var/log/my_custom_app/my_app2_20200505100941.log       ffffffffffffffff        00000000001ad2b3
/var/log/my_custom_app/my_app1_20200505100941.log       ffffffffffffffff        00000000001ad2b4
```

サービスを再起動すると削除されます。

```bash
sudo systemctl restart google-fluentd
sudo cat /var/lib/google-fluentd/pos/my_custom_app.pos 
```

## `fluentd`の最新機能
ただ、**crodで定期的に再起動しないとサービスを維持できない** というのは…ちょっと違いますよね…
この問題自体は2016年から問題として認識されていました。
https://github.com/fluent/fluentd/issues/1126

この解決として、2020-02-13 にリリースされた `Fluentd v1.9.2` から、`pos_file_compaction_interval`というパラメータが追加されています。
https://www.fluentd.org/blog/

検証してはいないですが、おそらくこのパラメータを`3d`などに設定すると、3日毎に`pos`ファイル上で`unmatch`になったエントリを削除する動作をするはずです。

## `google-fluentd`としては
本記事の執筆時点（2020年5月）では、`google-fluentd`のバージョンが少しだけ古いです。

```bash
$ google-fluentd --version
google-fluentd 1.7.4
```

という事で、筆者は**crodで再起動させて`pos`ファイルを綺麗にする**という選択をしています。
再起動したところで、ログが欠損するなどの事はないのでそこまで問題ではありませんでした。

# ファイル名をラベルに追加する
ファイル名が動的に生成される場合だと、ファイル名自体もCloud logging のラベルに含めたくなりますよね。
そういう時は `path_key` を使います。

```bash:/etc/google-fluentd/config.d/my_custom_app.conf
<source>
  @type tail
  format none
  path /var/log/my_custom_app/my_app*.log # ← * で動的ファイルを指定
  pos_file /var/lib/google-fluentd/pos/my_custom_app.pos
  read_from_head true
  path_key tailed_path
  tag "#{Socket.gethostname}.log"
</source>
```

```bash
$ sudo systemctl restart google-fluentd
$ sudo sh my_logger.sh my_app1 & sudo sh my_logger.sh my_app2
```

命名した`taild_path`というラベルにファイルのパスが格納されていますね。

<img width="600" alt="2020-05-05 212612.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/1f6131d3-c128-1b6a-7d82-58854e2dc5ab.png">

もちろんここから『アプリケーションの名前だけを抽出する』という事も簡単にできます。

```bash:/etc/google-fluentd/config.d/my_custom_app.conf
<source>
  @type tail
  format none
  path /var/log/my_custom_app/my_app*.log # ← * で動的ファイルを指定
  pos_file /var/lib/google-fluentd/pos/my_custom_app.pos
  read_from_head true
  path_key tailed_path
  tag "#{Socket.gethostname}.log"
</source>

<filter *.log> # ファイル名からアプリケーション名を取得して、app_name に格納する
  @type parser
  reserve_data          # ← 既存のラベルは保持するパラメータ。これを入れないとログのメッセージが消える。
  key_name tailed_path  # taild_path を正規表現でマッチングさせる。parser pluginを利用
  <parse>
    @type regexp
    expression /^\/var\/log\/my_custom_app\/(?<app_name>.+?)_\d{14}.log/
  </parse>
</filter>
```

例によって、綺麗にしてから実行します。

```bash:
sudo systemctl stop google-fluentd
sudo cp /dev/null /var/lib/google-fluentd/pos/my_custom_app.pos
sudo rm -f /var/log/my_custom_app*.log
sudo systemctl start google-fluentd
sudo sh ~/my_logger.sh my_app1 & sudo sh ~/my_logger.sh my_app2
```

連携されました。
<img width="600" alt="2020-05-05 214412.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598801/ba7bcd88-e0fa-0c05-c738-5a85a3049a73.png">

# 最後に
本連載記事では、`fluentd`で最も使われるであろう`tail plugin`, `parser plugin`を中心に検証してきました。
[公式サイト](https://docs.fluentd.org/)を見ると、今回検証したpluginやパラメータはもちろん、他にも色んな機能がある事がわかります。
本記事で扱ったくらいの`config`が書ければ、他の機能も苦労なく追加していけると思いますので、他に記事が増えていくと嬉しいです！