SharePoint の IIS ログをアイテム単位で解析できるよう整形する

SharePoint のリストアイテムは、基本的に DispForm.aspx?ID=n というURLで特定されます。しかし、実際には、その前後に様々なパラメータが付与されます。

アクセス解析時には、この点が実に問題です。
ログ上では、パラメータ毎に、すべて別の URL として扱われてしまうためです。
※パラメータを有効にして解析を行った場合─アイテム単位の解析では必須。

これを回避するためには、事前にIIS ログ側を整形しておく必要があるのですが…。
これがなかなか難儀な作業です。


まず、通常のアイテムは、DispForm.aspx?ID=n の後に、&Source=hogehoge… がつきます。
ただし、コンテンツクエリWebパーツからアイテムにアクセスした場合は、
&RootFolder=hogehoge.. になります。

ブログの場合は、さらに複雑です。
ブログの記事(アイテム)は「投稿(/Posts/)」リストに保存されますが、リストのビューや、コンテンツクエリWebパーツ経由で記事にアクセスすると、一旦 ViewPost.aspx に飛ばされてから、Post.aspx にリダイレクトされる仕様になっています。
つまり二重カウントされてしまうので、ViewPost.aspx は解析から除外しておく必要があります。

そして、ViewPost.aspx を経由した場合、URLは
/Posts/Post.aspx?List=hogehoge..&ID=n&Source=hogehoge..と、ID= を真中に挟んだ形式で記録されます。

ちなみに、このID= ですが、他にも ListId= や WebId= などが存在するため、単純に ID= で検索・置換にかけることはできません。
case sensitive(大文字小文字を区別する)にしても FolderCTID= というのがあるので厄介です。

次に、特殊なのがディスカッションリストです。
ディスカッションリストは、リストですが ID= でアイテムを特定できません。
ログはスレッド単位で記録され、URL の形式は以下です。

/Flat.aspx RootFolder=(タイトルを含むURL)&FolderCTID=hogehoge&TopicsView=hogehoge
/Threaded.aspx RootFolder=(タイトルを含むURL)&FolderCTID=hogehoge&TopicsView=hogehoge

スレッドは、RootFolder=(タイトルを含むURL)までで特定されます。
&FolderCTID=hogehoge&TopicsView=hogehoge は不要です。

厄介なのは、タイトルに日本語が含まれている場合です(大抵あると思いますが)
SharePoint の仕様で、日本語の URL は UTF-8 でエンコードされます。

しかし、今回利用する解析ツールは ANSI 前提です。
このため、UTF-8 の URL は、レポート化した際に文字化けします。
当然、URL としても無効で、役には立ちません。

辛うじて、ブラウザの設定で文字コードを UTF-8 に変更すると、このタイトルを判読できるようになります。─かわりに他が全て文字化けしますが。
また、エンコードされない日本語を含む URL はディスカッションリストでは無効ですので、タイトルだけ判明しても、スレッドにアクセスすることはできません(探す材料にはなりますが)

残念ながら、この問題を解決する方法は(私には今のところ)ありません。
せめて UTF-8 をそのまま出力してくれれば良かったのですが・・・。

選択肢は二つです。
ひとつは、RootFolder= 以下を全て削除してしまい、ディスカッションリストに関してはリスト単位でのアクセス解析に留める方法。
二つ目は、文字化け前提で あえて RootFolder= を残し、
&FolderCTID=hogehoge&TopicsView=hogehoge を削除します。
これなら、一応、スレッド単位でのアクセス記録が残ります。

リスト単位の解析であれば、後からでも、解析ツール側のオプションで簡単に出来ますので、どちらかと言えば後者のアプローチが正しいような気がします。

なお、ドキュメントライブラリでも同様の問題が発生します。
ユーザがブラウザからフォルダを辿ると、URL は以下の形式で表記されます。

/Doc/Forms/view.aspx?RootFolder=(フォルダ名を含むURL)&FolderCTID=hogehoge&View=hogehoge

ここでも、やはり日本語を含むフォルダ名が文字化けし、無効な URL になります。
ただ、ディスカッションリストと違うのは、実際にアクセスされたファイル(含パス)は、エンコードされずに記録される点です。
以下のようになります。

http://server/site/doc/フォルダ名/ファイル名.orz

あとはアクセス解析の「目的」をどこに置くかです。
「ユーザがどのフォルダにアクセスしたのか」を解析したい場合、ディスカッションリストと同様に、文字化けしていても RootFolder=hoge 迄を残しておく必要があります。
しかし、実際にはむしろ「どのファイルが頻繁にアクセスされているか」の方が、重要なのではないでしょうか?この場合、RootFolder= を含め、パラメータを全て取り除いてしまうことが合理的です。

長くなりましたが、以上が SharePoint の IIS ログを整形する上で考慮するべき事項になります。
とは言っても、あくまで私が調べられた範囲ですので、漏れがありましたら教えていただけると大変嬉しいです。

さて、実際の置換ですが、かなり複雑な条件指定が必要になります。
通常のエディタでは無理だと思います。

私が利用しているのは TxVisualChange(シェアウェア)です。

このツールで作成した設定ファイルを置いておきますので、宜しければご利用ください。
Plan0001.zip

二行目の変数はユーザが所属する ActiveDirectory のドメインです。
三行目の変数はポート番号です。
お使いの環境に合わせて変更してください。
なお、ドメイン、ポート番号ともに一意であることが前提になっています。

様々なケースを想定したら40行を越えてしまいました。
もう少し頑張れば、もっとスマートなロジックに出来そうな気もしますが・・・。
力尽きたのでとりあえずこれで完成です(苦笑)

なお、置換条件が複雑な上、IIS のログそのものが膨大なため、置換にはかなり時間がかかります。
ファイル指定にワイルドカードを利用すれば、フォルダ内のログファイルをまとめて置換することも出来ますが、数ヶ月分のログをまとめて整形するような場合、恐ろしく時間がかかるので、置換を実行したら一晩放置推奨です(笑)

IISログから SharePoint のアクセス解析を行う


Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9