例えば、複数台のサーバのアクセスログの分析を行いたい!
そういったとき、便利なのがエージェント型のログ取集ツールです。
代表的なサービスには、fluentd、FlyDataがあります。
これらのサービスは、サーバにエージェントを常駐させ、監視対象ファイルに差分が発生したら、その差分をログとしてHadoopやAWSのRedshiftなどのストレージに書き込みをします。
分析をしている中で、なんだか値が変?ログがロストした気がする・・・!?
そんなとき、どこまで書き込みが行われたか確認する方法です。
確認する方法
エージェント型ログ収集ツールは、定期的に監視対象のファイルをどこまで読み込んだか記録します。
そのファイルを、posファイルと呼びます。
このposファイルの中身をチェックすれば、どこまでストレージに書き込みが行われたか確認することができます。
posファイルからわかること
監視対象ファイルと、そのファイルの読み込んだバイト位置までわかります。
それでは、早速posファイルの中身を覗いてみましょう。
posファイルの中身を確認する
$ cat /var/log/httpd/access_log.pos
/var/log/httpd/access.log 0000000000014e3d 060d4a45
このファイルは、右から
- 監視対象のファイル名
- 監視対象ファイルの読み込んだバイト位置
- 監視対象ファイルのinode
という構成になっています。
ここで重要となるのが、監視対象ファイルのinodeと読み込んだバイト位置です。
読み込んだバイト位置を説明する前に、inodeについて簡単に説明します。
inodeとは、各ファイルやディレクトリに割り当てられる管理用の番号のことです。
posファイルにinodeが書き込まれている理由は、ログローテートが発生した時のためです。
ログローテートが発生すると同じファイル名が作成され、古いファイルは別名で保存されます。つまり、監視対象のファイルのinodeはログローテートによって、新しいものに変わります。
では、実際にinodeを確認してみましょう。
$ ls -i /var/log/httpd/access_log
101534277 /var/log/httpd/access_log
ls
コマンドに-i
オプションをつけると、各ファイルやディレクトリに割り当てられたinodeを確認することができます。
あれ、posファイルに書き込まれた数値が違うと思ったあなた・・・!
posファイルは16進数で書き込まれているため、16進数から10進数に変換する必要があります。
# 英字は大文字にする必要があります
$ echo "obase=10;ibase=16;060D4A45" | bc
101534277
というわけで、先ほど確認したinodeと一致します。
同様に、監視対象ファイルの読み込んだバイト位置も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とバイト位置を確認することで、どこまでデータが転送されたか分かります。
それ以降の差分データを手掛かりに、実際にデータが転送されていることを確認しましょう。