Analogによる AN HTTPDのアクセスログ解析

作成日:2005.01.21

 Webサーバにアクセスがあると、どこのホストからサーバ上のどのファイルにアクセスされたかなどの情報がアクセスログとして記録される。ウイルスやアタックによるアクセスを調べたいのであれば、生ログをテキストエディタなどで直接見た方がよいが、どのファイルへのアクセスが多いかやどの程度の転送量であるかなど全般的なアクセス状況を調べるには、アクセスログ解析プログラムが使われている。

 AN HTTPDのアクセスログの記録形式は、NCSA Common Log Format と呼ばれるものであり、現在 Apacheなどで一般に使われている Combined形式とは異なり、Referer と User Agent(UA) が同一ファイルではなく別ファイルに記録される。そのため残念ながら Refererと UAに関する解析には目をつぶらざるを得ないが、他の内容は大抵のアクセスログ解析プログラムで解析可能ではないかと思う。

 鷹の巣さんが AN HTTPDのログファイルを Combined形式に変換する Perlスクリプトを作成されているので、それを使えば AN HTTPDのログ形式の変換は可能と思う(生成されたログの正確さという点では弱冠疑問があるかもしれない)。さらに鷹の巣さんが紹介 されている AWstats というアクセスログ解析プログラムは見栄えも解析内容も申し分なく、何か使えるアクセスログ解析プログラムはないかと探している人にはお勧めである。

 ここで紹介する Analogは、アクセス解析プログラムとしては一番の老舗(?)であり、カスタマイズの自由度が大きいので、自分なりに工夫をしたり、設定を変えていろいろ試してみたいという人には面白いと思う。アクセス解析プログラムを選ぶときの選択肢の一つになるであろうし、既に使っている人にも役立つ内容もあるかと思うので、以下では Analogを使って AN HTTPDのアクセスログ解析を行う方法を解説する。
  1. Analogのダウンロード
     Analogのダウンロードのページ http://www.analog.cx/download.html から、Windows用の最新版プログラムをダウンロードし、C:\Program Files\analog以下に解凍する。2004.12末現在バージョン 6.0(analog_60w32.zip)が最新版である。

  2. analog.cfgファイル
     各種の設定は analog.cfgファイルによって行う。Analogを解凍したフォルダに作成される analog.cfgはほとんどのコマンドを省略してデフォルトのまま使うときの設定ファイルである。必要最低限の設定だけ行って使ってみるのもいいが、解析結果の表示をいろいろとカスタマイズしたいときには、どのようなコマンドが使えるのかがこの analog.cfg ファイルからでは分からないのでちょっと使い辛いと思う。
     詳しい configuration ファイルが examples\big.cfg にある。ほとんどのコマンドを網羅しており、しかも同類のコマンドが隣接して並べる形でまとまっているので分かり易さという点ではいいと思う。
     この big.cfgとは別に examples\bigbyrep.cfg というファイルもあり、こちらは表示項目(内容)に注目し、特定の項目の設定に関連するコマンドを並べる形で記述されており、分かり易さは劣るが使い易さはいいのではないかと思う。ここでは bigbyrep.cfg を analogフォルダの下にコピーし、ファイル名を analog.cfgに変更して使うことにする。

  3. ログファイル/ログフォーマットの設定
     マニュアル参考ページ:http://www.jp.analog.cx/jp5.911/logfmt.html

     AN HTTPDではログファイルは httpd.log, referer.log, ua.log の 3つに分かれている。Analogを使って AN HTTPDのログ解析を行う方法を解説したページで、3つのファイルのままで解析する方法を説明したものは Googleで探しても見当たらない。Analogのマニュアルによるとログファイルのフォーマットを設定すれば可能なようである。
     以下では AN HTTPDのログはフォルダ C:\Program Files\httpd\log の下に格納されているとの前提で説明するが、自分の環境に合わせて読み替えること。3つのファイルをそのままで解析するには、analog.cfgを以下のように書き並べればよい。LOGFILE 以前に書かれた LOGFORMATの最後のものを使うというルールなので、コマンド行の記述順序を勝手に変更しないこと。
    LOGFILE "C:\Program Files\httpd\log\httpd*.log"
    LOGFORMAT (%j %M %d %h:%n:%j %Y %f -> %*r)
    LOGFILE "C:\Program Files\httpd\log\referer*.log"
    LOGFORMAT (%j %M %d %h:%n:%j %Y %B)
    LOGFILE "C:\Program Files\httpd\log\ua*.log"
     ここでファイル名の指定に httpd*.log のようにワイルドカード(*)を使っているが、これは過去の全ログファイルを指定することを意味している。AN HTTPDのオプションの「ログ更新」が「更新しない」「毎月」「毎日」「毎回」のどれに設定されていても上の記述のままで変更不要である(パスの部分は環境依存なので適宜要変更)。個人的には「ログ更新」を「毎月」にすることをお勧めする。

    (注)User Agentのログ(ua.log)は
     曜日 月 日 時:分:秒 年 ユーザエージェント名 -> ファイル名
    の書式で記録されるが、ユーザエージェントによって名称に含まれる半角空白の数が異なるため、どう頑張っても LOGFORMATで「->」の前後を区別することができない。そのため、上の LOGFORMAT では「->」以降も含めて UA名になってしまう。このままでは「ブラウザレポート」や「ブラウザ集計」の UA名にゴミが入ってしまうのを避けられない。
     見苦しいことを我慢すれば他には支障はないが、美しい表示にしたいならログファイル上で不要な個所(「->」以降)を削除するとよい。Perlで s/\s->\s.*$// を実行するスクリプトを作成し(サンプルを後述)、ua.logを書き換えた別ファイルを作成するか、あるいは EmEditorなど正規表現で文字列の置換が可能なテキストエディタを使っても削除できる(ログファイルのサイズによってはテキストエディタは実用的ではない)。ログの書き換えはオリジナルのログファイルに直接行うのではなく、別フォルダにコピー後、あるいは処理した結果を別フォルダに保存すること。

  4. 解析結果の保存先の設定
     マニュアル参考ページ:http://www.jp.analog.cx/jp5.911/output.html#OUTFILE

     Analogを実行して作成された解析結果の HTMLファイルの保存先を指定する。解析結果を公開するのであればドキュメントルート下の適当なファイルを設定する。非公開ならどこでも適当な場所に。analogのプログラムフォルダ下の imagesフォルダを解析結果の HTMLファイルを置いたフォルダ下にコピーすること(以下の例では C:\www\analog\images)。
    OUTFILE "C:\www\analog\index.html"
  5. 解析期間の設定
     マニュアル参考ページ:http://www.jp.analog.cx/jp5.911/include.html#FROMTO

     ログ解析をどの期間を対象にして行うかを FROM, TO を使って設定する。設定しなければログに含まれる全期間ということになるが、ここでは、月初めに先月末までの過去一年間を対象にログ解析を行う場合の例を以下に示す。FROM, TO を yymmddの形式にすればその年月日を意味し、-yy-mm-ddのように - を付ければ何年前、何ヶ月前、何日前を意味する。この下の FROM, TOは両方を組み合わせたものである。
    FROM -01-0001 #一年前の同月1日から
    TO -00-0131 #先月31日まで
  6. 文字コードの設定
     マニュアル参考ページ:http://www.jp.analog.cx/jp5.911/output.html#LANGUAGE

     AN HTTPDのログファイルの文字コードは Shift-JISなので通常は以下のように設定すればよい。
    LANGUAGE JAPANESE
    LANGFILE lang\jps.lng
    DOMAINSFILE lang\jpsdom.tab
    # DESCFILE lang\jpsdesc.txt
     文字コードは Shift-JIS 以外に、JIS, EUC, UTF-8に設定することができる。その場合は、上記の「jps」の 3個所をそれぞれ「jpj」「jpe」「jpu」にする。解析の結果として作成される HTMLファイルはここで指定した文字コードになる(meta行も)。

     もし AN HTTPDで日本語のフォルダ名/ファイル名を使っていないなら、上記の設定後、analog.exe を実行すれば問題なく結果が作成され、表示できる(日本語のフォルダ名/ファイル名を使っていても一部文字化けすることを確認するためにここらで試しに実行してみてもよい)。

     残念ながらどの文字コードに設定してもログに日本語が含まれ、ログファイルの文字コードが Shift-JISなら解析結果を表示すると文字化けする。解決策はログファイル自体の文字コードを EUCあるいは UTF-8に変換することである。以下で説明する「検索語」を表示しないときはどちらの文字コードでも構わないが、「検索語」を表示させたいなら、専用の変換プログラムを用いて UTF-8 に変換しなければいけない。

     Google, Yahoo, MSN などの検索エンジンからアクセスされたときに使われたキーワードである「検索語」「検索語句」は referer.log を調べて解析される。検索語(キーワード)が日本語のときには URLエンコードされて referer.logに現れるが、上記の 3つの検索エンジンだけでも URLエンコードに使用される文字コードが異なるという厄介な問題が存在する。そのためログファイルを単純に UTF-8に変換してもコードが揃わない。以下で説明するように専用のプログラム(utf8_decode.pl)を使ってログファイルを適切に UTF-8に変換し、analog.cfgでは UTF-8に設定(LANGFILE lang\jpu.lng など)しないといけない。「検索語」「検索語句」を表示しないなら、SEARCHWORD と SEARCHQUERYを OFFにし、コードは Shift-JISのままで構わない。

     また、サーバ自身が Namazuなどの検索システムを持っており、検索に使われたキーワードを解析して「内部検索語」「内部検索語句」を表示させたければ、やはりログファイルを UTF-8 化しないといけない。こちらのキーワードは referer.logではなく httpd.logにやはり URL エンコードされて書かれている。UTF-8化はやはり上記の utf8_decode.pl を使って行う。「内部検索語」も「内部検索語句」も表示しないのであれば INTSEARCHQUERY と INTSEARCHWORD を OFFにする。
     Namazuの場合は、以下のように Namzuのパスと引数に使用する語("query")を設定する。
    INTSEARCHENGINE /cgi-bin/namazu/* query
     結局、検索関係のキーワードを文字化けしないで表示させるには、utf8_decode.pl を使ってログファイル自体を UTF-8に変換しなければいけないということであり、以下にその方法を示す。

    http://www.bflets.dyndns.org/Tools/AWStatsJpn.htmlから AWStats 6.0完全日本語版をダウンロードする。
    ・解凍したファイルの中の wwwroot\cgi-bin\utf8_decode.plをログの UTF-8変換のために使用する。
    http://ftp.kaist.ac.kr/pub/CPAN/authors/id/D/DA/DANKOGAI/から最新版の Jcode-x.xx.tar.gzをダウンロードし、解凍してできたファイルの中にある win_install.pl をコマンドプロンプトから実行する(perl win_install.pl)。この結果、C:\Perl\site\lib 下に Jcode.pm と Jcodeフォルダがインストールされる。
    ・C:\Program Files\httpd に log2 フォルダを作成し、
     Perl utf8_decode.pl < "C:\Program Files\httpd\log\httpd.log" > "C:\Program Files\httpd\log2\httpd.log"
    を全ての httpd*.log と referer*.log に対して実行する。
     さらに ua*.logを log2にコピーし、「->」以降を削除する(UAに日本語は含まないのでUTF-8化する必要はない)。「->」以降を削除するスクリプトのサンプルを以下に示す。
    $fname="ua.200412.log";
    $indir="C:/Program Files/httpd/log";
    $outdir="C:/Program Files/httpd/log2";
    open(IN, "$indir/$fname");
    open(OUT, "> $outdir/$fname");
    
    while (<IN>) {
    s/\s->\s.*$//;
    print OUT $_;
    }
    close(IN);
    close(OUT);
    exit;
    
    ・上記 3. の LOGFILE 3個所の ...\log\... を...\log2\... に変更する。

  7. DNSの設定
     マニュアル参考ページ:http://www.jp.analog.cx/jp5.911/dns.html

     アクセス元のホストをIPアドレスではなくホスト名で表示したいときに DNSコマンドを設定する。ただし、AN HTTPDのオプション/一般で「リモートホストを取得」を「常時」に設定していると、ログには既にホスト名が書かれているのでホスト名に変換する必要はない(DNS行があれば #を付けてコメントにするか DNS none とする)。
    DNS WRITE
    DNSFILE dnscache.txt
     ここで注意することは、DNSによる名前解決を実行すると極端に時間がかかるということである。ログファイルのサイズにもよるが、何十分あるいは何時間もかかるかもしれないので、覚悟すること。ただし一度実行してしまえばIPアドレスとホスト名の対応関係はファイル(dnscache.txt)に記録されるので、次回の実行時には新たなアクセスに対してのみ DNSを参照するので、初回のように時間がかかるということはない。

  8. 雑多な項目の設定
    HOSTNAME "www.example.com" #サーバ名
    HOSTURL http://www.example.com/ #サーバ名からのリンク先URL
    LOGO analogo #Analogのロゴを表示
    LOGOURL http://www.analog.cx/ #ロゴからのリンク先URL
    GOTOS OFF # ページ内のジャンプの抑止
    LASTSEVEN ON #直近の7日間の統計を表示
    WEEKBEGINSON SUNDAY #週の開始日は日曜か月曜か
    BARSTYLE j #グラフのバーの色
    GENSUMLINES ALL #全体の概要に表示する項目
    SUBDOMAIN *.*.*.* #サブドメインを表示する階層の深さ(この例では4階層)
  9. レポートの表示ON/OFF設定
     マニュアル参考ページ:http://www.jp.analog.cx/jp5.911/output.html#REPLIST

     Analogで表示可能なレポートは上記のページに一覧がある。analog.cfgではデフォルトで表示する設定になっているものと表示しない設定のものがあるので、一度全て ON にしてどんな表示がされるのかを確認してから表示するかしないかを自分で決めた方がいいであろう。また表示の順序を変更するときは、http://www.jp.analog.cx/jp5.911/output.html#REPORTORDERを参考に。

  10. 各レポートの表示内容の設定
     各レポートの表示内容を制御するためにいろいろなコマンドが使える。ここでは詳細な説明はしないのでマニュアルを参考に。
     まず、*COLS コマンドではリクエスト数、ページ数、転送量などの出力を制御する。時間レポート系とその他のレポートでは多少内容が異なるのでそれぞれ、時間レポート時間レポート以外を参考のこと。
     時間レポートでは何を棒グラフ表示するかの *GRAPH コマンド、時間レポート以外では、パイチャート(円グラフ)を表示するかどうかの *CHART コマンド、表示順序を何でソートするかを設定する *SORTBY コマンド、どのくらいアクセス頻度のものまで表示するかを制御する *FLOOR コマンド などがある。とりあえずデフォルトのままで表示はされるので、デフォルトに飽き足らないときにいろいろと変更してみるのがいいだろう。

  11. 包含、除外の設定
     *INCLUDE, *EXCLUDE コマンドを使うと、統計量をより実態に近いものにすることができる。例えば、
     ・どの種類のファイルをページとみなすか PAGEINCLUDE, PAGEEXCLUDE
     ・自分のアクセスをカウントから外すとき HOSTEXCLUDE 127.0.0.1, HOSTEXCLUDE localhost, HOSTEXCLUDE www.example.com など
     ・自サイトからのリンクを参照元から外すとき REFREPEXCLUDE http://127.0.0.1/*, REFREPEXCLUDE http://localhost/*, REFREPEXCLUDE http://www.exanple.com/* など
     ・gifなど特定の拡張子のファイルへのアクセスはカウントしない REQEXCLUDE
     ・バーチャルホスト毎にディレクトリを分けていれば、特定ディレクトリ以下を解析範囲に設定すればバーチャルホスト毎の解析が可能(と思う) FILEINCLUDE, FILEEXCLUDE
    等々。
     これらはどういう動作になるか設定変更しながら確認するとよい。

  12. Analogの実行
     explorerから analog.exeをクリックしてもよいが、実行後ウィンドウが閉じるので、メッセージが出力されたときに読み取れない。コマンドプロンプトから analog とコマンドを入力して実行するのがよいだろう。
     設定内容を確認したいときはコマンド analog -settings を実行する。


  13. サンプル
     ・analog付属のサンプルログを加工(httpd.log, referer.log, ua.log)
     ・とりあえずな analog.cfg
     ・上記のログとanalog.cfgによる 解析結果

     このページの方法で AN HTTPDのログ解析をし、公開された方があればリンクさせてください。

  14. リンク
     ・Analogホームページ
     ・日本 Analog ユーザ会
     ・Analog のマニュアル


作成:いと,mailto:gfh05223@nifty.com