(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【fluetnd/tdagent】failed to flush the bufferの原因を解消してもログ書き込みが行われない

スポンサーリンク

事象

tdagentが受信したログがファイルとして生成されていない。
尚、/var/log/td-agent/td-agent.logにて以下メッセージが出力されているがその原因となる事象は解消している。

... [warn]: #0 failed to flush the buffer. retry_time=8 next_retry_seconds=XX +0900 chunk="..." error_class=Errno::EACCES error="Permission denied @ rb_sysopen - /mylog/nginx.log"
環境情報
  • Red Hat Enterprise Linux Server 7.9
  • fluentd 1.10

原因/解決策

Fluentdの仕様としてnext_retry_secondsに指定されている時刻にて再送が行われるので、事象が解消しても直ちにログは生成されない。
よって該当時刻になると、tdagentのログには以下のように書き込まれた上で

... [warn]: #0 retry succeeded. chunk_id="..."

所定のログにも書き込みが行われる。

尚、冒頭のエラーは出力先として指定しているログファイルにtd-agentユーザ/グループの書き込み権限がないことが原因で、同ファイルに権限を付与すると解消。

以下、補足です。

補足

tdagent側でのリトライ回数はretry_limitで指定でき、デフォルトだと17回までリトライを試みます。
このリトライ間隔はmax_retry_waitやretry_waitで制御できますが、デフォルトであれば回数が増える度に以下のように指数的(数秒→数十秒→数分→数時間)に増加していきます。

retry_time=2 next_retry_seconds=2021-09-24 19:08:50 +0900 ...
retry_time=3 next_retry_seconds=2021-09-24 19:08:54 +0900...
retry_time=4 next_retry_seconds=2021-09-24 19:09:01 +0900...
retry_time=5 next_retry_seconds=2021-09-24 19:09:17 +0900...
retry_time=6 next_retry_seconds=2021-09-24 19:09:47 +0900...

故に事象が解消したとしてもnext_retry_secondsに記載されている時刻にならないとログへの書き込みが行われない点は注意が必要で、このリトライ処理が行われる前にtd-agentのプロセスが停止してしまうと同chunk_idで管理されていたメッセージはロストしてしまいます。

以上です。