LoginSignup
3
0

More than 3 years have passed since last update.

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

Posted at

はじめに

前回の続きです。
https://qiita.com/ys_nishida/items/d9351eb602de42e6a1ab

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

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

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

posファイルの肥大化の解消

執筆時点での方法(2020年5月時点)

posファイルにて、unwatchになったエントリは、google-fluentdを再起動する事で削除されます。
前回 の最後のposファイルは以下です。

/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

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

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のバージョンが少しだけ古いです。

$ google-fluentd --version
google-fluentd 1.7.4

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

ファイル名をラベルに追加する

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

/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>
$ sudo systemctl restart google-fluentd
$ sudo sh my_logger.sh my_app1 & sudo sh my_logger.sh my_app2

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

2020-05-05 212612.png

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

/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>

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

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

連携されました。
2020-05-05 214412.png

最後に

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0