複数サーバーのアクセスログを統合するのにAWStatsが便利だった件
システム部の山田です。
今回は複数のWEBサーバーに分散されたApacheのアクセスログを一つにまとめる方法について。
事のはじまり
先日とあるサイトのアクセスログを解析することがあったのですが、
そのサイトはWEBサーバーがバランシングされた環境下で複数存在していました。
もちろん、アクセスログもサーバー毎にバラバラ。
ずいぶん昔からあるサイトで、fluentdみたいな素敵ツールも入ってない状態です。
で、ちょっと急ぎの要件だったのでとにかく手っ取り早く、時系列ごとに1ファイルで統合したいなーと。
ありました。ありましたよ。いいツールが。
「logresolvemerge.pl」
これは最近ちょっと見なくなった「awstats」というアクセス解析ツールの中にあるスクリプトです。
いまではアクセス解析といえば「GoogleAnalytics」なんかが超有名ですが、
一昔前は当たり前の様に「awstats」を入れてた記憶があります。(山田調べ)
これでどんなことができるかとゆーと、
This runs logresolvemerge in command line to open one or several
server log files to merge them (sorted on date) and/or to make a reverse
DNS lookup (if asked). The result log file is sent on standard output.logresolvemergeはコマンドライン上で動作するウェブサーバーログファイルを一つ、
またはいくつかのサーバーログファイルを(日付で並び替えて)統合し、
(任意で)DNSを逆引きします。実行結果のログ内容は標準出力されます。
引用元: AWStats logfile analyzer 7.5 Documentation
おお!これこれ!
Usage: logresolvemerge.pl [options] file (1ファイルのみの日付ソート) logresolvemerge.pl [options] file1 ... filen (複数ファイルの日付ソート&統合) logresolvemerge.pl [options] *.* (ディレクトリ内のログ全部を日付ソート&統合) perl logresolvemerge.pl [options] *.* > newfile (ディレクトリ内のログ全部を日付ソート&統合してnewfile に書き込み) Options: -dnslookup make a reverse DNS lookup on IP adresses (IPアドレスをDNSから逆引きする) -dnslookup=n same with a n parallel threads instead of serial requests (dnslookupをn個の並列スレッドで実行する) -dnscache=file make DNS lookup from cache file first before network lookup (ネットワーク参照前にキャッシュファイル「file」からDNSルックアップを行う) -showsteps print on stderr benchmark information every 8192 lines (8192行毎にstderrのベンチマーク情報を出力する) -addfilenum if used with several files, file number can be added in first (複数ファイルの場合、ファイル番号を最初に追加する) -addfilename if used with several files, file name can be added in first field of output file. This can be used to add a cluster id when log files come from several load balanced computers. (複数ファイルの場合、バランシングされたコンピューターのクラスタIDを追加するためにファイル名を出力ファイルの最初のフィールドに追加する) -stoponfirsteof Stop processing when any logfile reaches end-of-file. (複数ファイルのうち一個でも最後の行に到達したら処理を止める) -printfields For IIS or W3C logs, prints the latest field header for the currentlog file when switching between log file entries so that the parsercan automatically determine which fields are avaiable. (IISまたはW3Cログの場合、最新のフィールドヘッダを出力する) -ignoremissing will not fail if a log file is missing (ログファイルに欠陥がある場合でも処理を落とさない)
注意として、「無保証である」「ソートは厳密ではない」「単一ファイルを並び替えるためのツールではない」ということが書かれています。
フリーのツールなので何か問題があっても怒らないでください。
やってみよう
まずはインストール
このサーバーには運よく「awstats」が入ってたんですが、
お手元のサーバーに入ってなければ以下のコマンドで入れてください。
cd /usr/src/ wget http://prdownloads.sourceforge.net/awstats/awstats-7.3.tar.gz tar zxvf awstats-7.3.tar.gz
yumで入れる場合はこっち。(ぶっちゃけlogresolvemerge.plだけ使いたいならソースだけでいいと思います。)
yum install --enablerepo=epel awstats
では実際にツールを使っていきましょう。
ログ統合
作業ディレクトリは適当に[/var/tmp]にしてますが、適宜変更してください。
※awstatsのインストールディレクトリはソースで入れた場合の「/usr/src/awstats-7.3」とします。
とりあえず、作業ディレクトリに必要なアクセスログを置いてあるものとします。
いざ!アクセスログ統合!
cd /var/tmp/ perl /usr/src/awstats-7.3/tools/logresolvemerge.pl web01-access_log web02-access_log > merged-access_log less merged-access_log
どやさ!
ちなみにawstatsのtoolディレクトリ以下には他にもいろんなツールがあるようです。
maillogconvert.pl … postfix、sendmail、qmailのログを人が読める形式に変換する urlaliasbuilder.pl … URLのリストファイルからURLエイリアスファイルを生成する
よかったら参考にしてみてください!
面倒なログ解析があるサーバー管理は丸投げしてもいいんですよ!