ようへいの日々精進XP

よかろうもん

td-agent の in_tail プラグインを使っている際に対象ログがローテーションする瞬間を見たい

きっかけ

  • ということで、td-agent(fluentd) のin_tail プラグインでログのローテーションをどのように捕捉して追従していくかを調べたい

やってみた

下記の環境においてクライアントから apacheab でアクセスさせて確認する。

確認したいこと

  • td-agent を介してログを記録している状況において、ログローテーションが発生した場合に td-agent はログの切り替わりを知って、それに追従するか。
  • 純粋に access.log ファイルに記録される内容(件数)と td-agent を介した記録内容(件数)に際が発生ないか。(ちょっとした負荷テスト的なことも)

環境

サーバー

クライアント

Apache へのアクセス

以下のようなパラメータでアクセスをシュミレートする。

ab -c 1000 -n 20000 http://xxx.xxx.xxx.xxx/

ログの切り替わり

ログの切り替わりは logrotate を参考に以下のように実行してシュミレートする。(実際にコマンドを実行する)

mv access.log access.log.1 && invoke-rc.d apache2 reload

また、検証を行う度に redis-serverredis-cliFLUSHALL を実行してレコードをクリアしている。

td-agent 無し

新規で access_log を作成し、ab を実行する。

access.log の件数

f:id:inokara:20130815003413p:plain

なんてこと無い 20000 レコードが記録されている。

td-agent あり(アクセスが発生していない状態でログが切り替える)

では本題。td-agent に /var/log/apache2/access.logtail させた状態で、ab を実行前にログの切り替えを行う。ログの切り替えに伴い apache のリロードが発生する。

f:id:inokara:20130815003640p:plain

apache をリロードしてみる。

td-agent.log の出力

f:id:inokara:20130815003821p:plain

注目したいのは detected rotation of /var/log/apache2/access.log; waiting 5 seconds の部分。詳細は後述。

access_log の件数

f:id:inokara:20130815003943p:plain

td-agent を介さない場合と同じように 20000 レコードが記録されている。

redis-server のレコード数

f:id:inokara:20130815004218p:plain

また、td-agent を介して redis-server に記録されたレコードも access.log と同様に 20000 レコードとなり取りこぼし等皆無。

td-agent あり(アクセス中にログが切り替わる)

いよいよ本丸。ab を実行後、10000 アクセスが完了した段階(アクセスの最中)でログの切り替えを行う。ログの切り替えに伴い apache のリロードが発生する。

f:id:inokara:20130815005313p:plain

絶妙のタイミング(汗)で apache のリロードを行い、且つ、スクリーンショットを撮る荒業。もっと良い検証の方法があるかもしれない...(汗

td-agent.log の出力

f:id:inokara:20130815005037p:plain

前述と同様に apache の reload(ログの切り替わり)のタイミングで detected rotation of /var/log/apache2/access.log; waiting 5 seconds が出力される。

access_log の件数

f:id:inokara:20130815005621p:plain

ログの切り替わりに伴い access.log と access.log.1 に分割されてしまっているが、合計で 20000 レコードとなる。

redis-server のレコード数

f:id:inokara:20130815010005p:plain

同じように redis-server にも 20000 レコードが記録されている。


ログが切り替わる時に何が起きるのか?

せっかくなのでソースコードを見る!

あの 5 秒は何?

スキル的にソースコードを読み解くことは出来ないが本当に残念だが、検証時にログが切り替わった段階で出力される detected rotation of /var/log/apache2/access.log; waiting 5 seconds に関しては in_tail.rb の以下が該当するのは解った。

f:id:inokara:20130815012633p:plain

あくまでも予想の範囲だが、この 5 秒時間というのは切り替わる直前のログをチェックしている時間なのかな...と思ったら、こちらでとても詳しく解説されていた。この設定は td-agent.confrotate_wait で指定することが出来る。

f:id:inokara:20130815200240p:plain

上記のようなイメージになると思われる(図中は fluentd と記載されているが td-agent と読み替えて頂ければ幸いです)。

ポジションファイルが重要みたい

in_tail プラグインを利用している場合にはポジションファイルを解析して td-agent がログの最新の位置を追っかけてくれているので、何らかの原因でサーバーが再起動してしまっても、最新の位置からログを追っかけてくれる。

f:id:inokara:20130815015256p:plain

赤線の左からフルパス指定のログファイル、ポジション、inode となる。


ということで

  • ログが切り替わる瞬間を目の当たりにすることが出来た
  • また、td-agent がどのようにしてローテションを捕捉しているのかが理解出来た(但し、細かい部分は引き続き...)
  • 今宵は良く眠れそう

参考