はじめに
前回の続きです。
https://qiita.com/ys_nishida/items/d9351eb602de42e6a1ab
前回は、以下の課題が残っていました。
-
pos
ファイルにunwatch
のログエントリが延々と残ってしまい、pos
ファイルが肥大化する - 処理しているファイル名をタグやラベルに追加する
今回はこれらについて記載していきます。
pos
ファイルの肥大化の解消
執筆時点での方法(2020年5月時点)
pos
ファイルにて、unwatch
になったエントリは、google-fluentd
を再起動する事で削除されます。
前回 の最後の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
を使います。
<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
というラベルにファイルのパスが格納されていますね。
もちろんここから『アプリケーションの名前だけを抽出する』という事も簡単にできます。
<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
最後に
本連載記事では、fluentd
で最も使われるであろうtail plugin
, parser plugin
を中心に検証してきました。
公式サイトを見ると、今回検証したpluginやパラメータはもちろん、他にも色んな機能がある事がわかります。
本記事で扱ったくらいのconfig
が書ければ、他の機能も苦労なく追加していけると思いますので、他に記事が増えていくと嬉しいです!