#fluentd in_tailの挙動について把握出来ていなかったまとめ
今日こんな事をつぶやいた。
#fluentd in_tailのfollowing開始時にその時の実ファイルでも一緒か。これってその時点の末尾から更新があった分だけ送信するとか指定出来たっけ?
よくよく考えるとこの時間帯はログのローテートがアプリ側で走る時間帯だった。
で、「あれ、in_tailって再起動しても過去分とか流れて来ないけど、ローテートすると違う?」とかで色々挙動を確認していたりしたら、指摘を頂きました。
1)新規に設定されたファイルは終端から読む 2)ログローテーションされたら次のファイルを先頭から読む 3)再起動時には前回読み終わった位置から読み始める(位置はファイルに保存しておく)
やや。Fluentd の in_tail の挙動は、1)新規に設定されたファイルは終端から読む 2)ログローテーションされたら次のファイルを先頭から読む 3)再起動時には前回読み終わった位置から読み始める(位置はファイルに保存しておく) #fluentd
in_tail はログを取りこぼさないようにかなり気を遣っていて、ファイルが切り替わっても(fdを開きっぱなしにして)前のファイルの監視をしばらく続ける。デフォルトで5秒後にファイルを閉じて次のファイルを読む。#fluentd
アプリが実際にログファイルを開き直すまでに追記されるログを取りこぼさないように。この時間は in_tail の rotate_wait パラメータで設定できて、デフォルトでは 5s(5秒)。#fluentd
ただし v0.10.13 から。#fluentd
逆に言うと、一度読み始めた所からはポジションファイルが失われない限り、ローテートが入ろうが再起動が入ろうが、その間のログ送信が止まってその分データが失われる、というのが無いという安心設計ですね!
なので、例えばストリーミング的に利用しているので、ある一定時間以内から溢れたデータはいらない、という場合は一度データストアに格納してそこから必要分を取り出すというのが筋ですね。