AzureのアクセスログをAWStatusで表示する。

Azureの診断機能によりIISのログを取得しているので、それをグラフィカルに集計したいと思いAWStatusを導入してみました。

環境は、ローカルのWindowsサーバでIISが動いていたので、そこに追加する形で設定しました。また、AzureのIISログはBlobからローカルへ定期的にDownloadしておきます。

  1. PerlによるCGIを動かすために、ActivePerl をインストール。
  2. AWStats Ver.7.0 完全日本語版 | Monoblogue of a security engineer よりAWStatusをダウンロード。
  3. 次にIISの設定ですが、サイトを追加しAWStatusを解凍したフォルダを物理パスに設定しておきます*1IISの設定で、「ハンドラーマッピング」で「スクリプト マップの追加」を行い、以下の様に設定します。

要求パス:*.pl
実行可能ファイル:ActivePerlのインストールしたパス(ex. C:\Perl64\bin\perl.exe "%s")
名前:何でも問題ないが「Perl CGI Script」等

  1. AWStatusでは、標準では一つのログファイルしか参照できません。しかし、AzureのIISログは1時間毎にファイル名がローリングされるようになっていて、さらに通常は2インスタンス以上で動かしていると思われるのでインスタンス分だけファイルが作られます。そういう時のために、toolsフォルダの中に、logresolvemerge.pl というスクリプトがありますので、以下のコマンドを実行することでログファイルをマージできます。
> logresolvemerge.pl (IISのログファイルフォルダ)\*.log
  1. AWStatusの設定は、wwwroot/cgi-binにある awstats.model_jp.conf を awstats.(ドメイン名).conf にコピーしてから、そのファイルを以下の箇所を変更します。これ以外の設定は、適宜自分で必要な項目を修正して下さい。

LogFile =(上記のlogresolvemerge.plによって作成されたログファイルのパス)
LogFormat = "%time2 %other %other %cluster %method %url %query %other %logname %host %other %ua %other %referer %virtualname %code %other %other %bytesd %other %other" (LogFormatは、IISで何も変更しない場合に出力されるログに合わせてあります*2。)
SiteDomain=(Azureでサービスしているサイトのドメイン名)
ShowAuthenticatedUsers=PHBL (ログインしているユーザの統計を取る場合)
LoadPlugin="timezone +9" (AzureではログがUTCで出力されるため、JSTに修正する場合にはこれを指定する)

  1. 最後に、logresolvemerge.pl でまとめたログを元にサイトの情報を更新します。以下のコマンドを実行するとサイトの情報が更新されます。後は、/cgi-bin/awstats.pl にアクセスすることでアクセス情報が閲覧できます。
> awstats.pl -config=ドメイン名 -update
  1. 上記の手順で、AzureのIISログをAWStatusで見ることができました。後は、タスクスケジューラ等で「ログファイルのマージ」→「サイト情報の更新」を定期的に行って行くことで最新の情報を閲覧できるようになります。

*1:外部に公開する場合には、不要なファイルを置かないようにしたり、色々と気を使って下さい

*2:ログファイルのヘッダ行に「#Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken」と記述されていれば、この定義で問題ありません。