fluentd
td-agent
FlyData

ファイルがどの位置までログが転送されたか確認する方法(fluentd/FlyData)

More than 1 year has passed since last update.

例えば、複数台のサーバのアクセスログの分析を行いたい!
そういったとき、便利なのがエージェント型のログ取集ツールです。
代表的なサービスには、fluentdFlyDataがあります。

これらのサービスは、サーバにエージェントを常駐させ、監視対象ファイルに差分が発生したら、その差分をログとしてHadoopやAWSのRedshiftなどのストレージに書き込みをします。

分析をしている中で、なんだか値が変?ログがロストした気がする・・・!?
そんなとき、どこまで書き込みが行われたか確認する方法です。

確認する方法

エージェント型ログ収集ツールは、定期的に監視対象のファイルをどこまで読み込んだか記録します。
そのファイルを、posファイルと呼びます。
このposファイルの中身をチェックすれば、どこまでストレージに書き込みが行われたか確認することができます。

posファイルからわかること

監視対象ファイルと、そのファイルの読み込んだバイト位置までわかります。
それでは、早速posファイルの中身を覗いてみましょう。

posファイルの中身を確認する

apacheのアクセスログのposファイルを開く
$ cat /var/log/httpd/access_log.pos
posファイルの中身
/var/log/httpd/access.log   0000000000014e3d        060d4a45

このファイルは、右から

  • 監視対象のファイル名
  • 監視対象ファイルの読み込んだバイト位置
  • 監視対象ファイルのinode

という構成になっています。

ここで重要となるのが、監視対象ファイルのinode読み込んだバイト位置です。

読み込んだバイト位置を説明する前に、inodeについて簡単に説明します。

inodeとは、各ファイルやディレクトリに割り当てられる管理用の番号のことです。
posファイルにinodeが書き込まれている理由は、ログローテートが発生した時のためです。
ログローテートが発生すると同じファイル名が作成され、古いファイルは別名で保存されます。つまり、監視対象のファイルのinodeはログローテートによって、新しいものに変わります。

では、実際にinodeを確認してみましょう。

ファイルのinodeを確認する
$ ls -i /var/log/httpd/access_log
実行結果
101534277 /var/log/httpd/access_log

lsコマンドに-iオプションをつけると、各ファイルやディレクトリに割り当てられたinodeを確認することができます。

あれ、posファイルに書き込まれた数値が違うと思ったあなた・・・!
posファイルは16進数で書き込まれているため、16進数から10進数に変換する必要があります。

16進数から10進数に変換
# 英字は大文字にする必要があります
$ echo "obase=10;ibase=16;060D4A45" | bc
実行結果
101534277

というわけで、先ほど確認したinodeと一致します。

同様に、監視対象ファイルの読み込んだバイト位置も10進数に変換すると・・・

16進数から10進数に変換
# 英字は大文字にする必要があります
$ echo "obase=10;ibase=16;0000000000014E3D" | bc
実行結果
85565

これらのことから、

  • inode番号101534277のファイル85565バイト

まで読み込まれたことがわかります。

実際にログファイルを確認してみる

それでは、inode番号101534277のファイル85565バイトを表示させてみます。

$ head -c 85565 /var/log/httpd/access_log

headコマンドに-cオプションを付け、バイト数を指定すると、そのバイト数まで表示することができます。
重たいファイルを実行するときには、気をつけてください。

ここまでは確実にデータが転送されたということになります。
それ以降に書き込まれたファイルが確実に転送されたかを確認するには、ログの保存先であるHadoopやredshiftでクエリを打ちます。

ログの保存先でクエリを実行する

クエリを打つ前に、85565バイト以降の/var/log/httpd/access_logに書き込まれたデータからIPアドレス日付アクセス先といった特定できそうな情報をメモしておきます。
特に、日付は秒数まで記録されているので重要な手がかりとなります。

特定できそうな情報をもとに、SQLを作成してクエリを実行します。

クエリ例
SELECT *
FROM apache_access
WHERE date = '2016-06-1015:00:00+09:00'

ここでデータが返ってこれば、ログが保存されたことが保証されます。
もし、返って来なければ、転送する最中にロストした可能性が高いです。

まとめ

代表的なサービスとして紹介したエージェント型のログ取集ツールは、定期的に監視対象のファイルをどこまで読み込んだか記録しています。
このファイルに書き込まれたinodeとバイト位置を確認することで、どこまでデータが転送されたか分かります。

それ以降の差分データを手掛かりに、実際にデータが転送されていることを確認しましょう。