- PR -

Log ParserをC#から呼び出してIISログを図表処理する方法

1
投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2007-04-30 15:26
お世話になります。

MicrosoftのLog Parser 2.2を使って、IISのアクセスログを処理したいと思い、いろいろと触っているところです。
コマンドラインやWSHからの利用方法は参考サイトがたくさんあり、見様見真似である程度使えるようになってきました。次に、ログ処理の自動化(例えば日に一度、前日のログを処理してグラフを作成しておくとか)を検討するにあたり(通常ならWSHとかで書いたスクリプトをWindowsサービスに登録したりするのではないかと想像しているのですが)私自身がVBScriptをほとんど忘れてしまったことや、別個に管理するよりはウェブアプリに組込んだ方が管理しやすいだろうということで、ASP.NET(C#)から呼び出して使う方向で考えています。

ということで、Log ParserのCOM APIを使っての利用ということになるのですが、とりあえず、ASP.NETとかは抜きにして、WindowsアプリケーションからCOM APIを試してみることにしました。MSUtilへの参照設定などを済ませ、HELPや海外のサイトを参考にして、W3CログのXMLファイルへの変更はできましたが、より直感的に分かりやすくしようと、ログを図(CHART)にする処理で躓いてしまいましたのでアドバイスをいただけたらと思います。

まず、コマンドラインで以下のページビューの集計を実行し、ちゃんと図が作成されることを確認しました。(ログファイル:"./ex060427.log" → 図:"./Test.gif")

LogParser "SELECT key, counter USING TO_UPPERCASE(cs-uri-stem) AS key, COUNT(*) AS counter INTO ./Test.gif FROM ./ex060427.log WHERE (cs-uri-stem LIKE '%.aspx' OR cs-uri-stem LIKE '%.htm%')AND (sc-status = 200) GROUP BY key ORDER BY counter DESC" -o:CHART -chartType:Column3D

次にこれをWindowsアプリケーションの中からCOM APIを使って実現しようと、Form1_Load内に以下のコードを書きました。

MSUtil.ILogQuery log = new MSUtil.LogQueryClassClass();

//input context
MSUtil.COMIISW3CInputContextClass inputContext = new MSUtil.COMIISW3CInputContextClassClass();

//output context
MSUtil.COMChartOutputContextClass outputContext = new MSUtil.COMChartOutputContextClassClass();
outputContext.chartType = "Column3D";
outputContext.chartTitle = "ページビュー";
outputContext.categories = "OFF";

string strCommand =
"SELECT key, counter " +
"USING TO_UPPERCASE(cs-uri-stem) AS key, COUNT(*) AS counter " +
"INTO C:/test/Log/ex060427.gif " +
"FROM C:/test/Log/ex060427.log " +
"WHERE (cs-uri-stem LIKE '%.aspx' OR cs-uri-stem LIKE '%.htm%')AND (sc-status = 200) " +
"GROUP BY key " +
"ORDER BY counter DESC";

log.ExecuteBatch(strCommand, inputContext, outputContext);

しかし、これだと、「カラムkeyは整数型でもREAL型でもありません」という実行時エラーが出てしまい、処理できません。確かにkeyは整数やRealではないですが、クエリー文自体はコマンドラインで図を作成した時とほぼ同じですし何故?
試しに、同じコードで出力をXMLに差し替えただけだと、問題なく出力されますので問題はクエリー文ではないのではと思っていますが、COMだと何かが違うのでしょうか?Windowsアプリケーション自体もほとんど経験ないのと、.NETからCOMを呼び出すのも初めてなのでなにかしら勘違いをしているのではという心配もありますので、アドバイスいただければと思います。
よろしくお願いします。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2007-05-01 11:43
大変申し訳ありません。解決しました。
最初のコード、

//output context
MSUtil.COMChartOutputContextClass outputContext = new MSUtil.COMChartOutputContextClassClass();
outputContext.chartType = "Column3D";
outputContext.chartTitle = "ページビュー";
outputContext.categories = "OFF";

の最後の行をコメントアウト(この場合のデフォルト値はAUTO)すると、図が作成されました。
確かにコマンドラインとクエリ文は同じでしたが、この部分が違っていました。もう少し早く気づくべきでした。

ヘルプによると、categoriesは、
「カテゴリ軸にカテゴリ ラベルを表示します。」
ということで、この値がOFFの場合には、
「このパラメータを "OFF" に設定すると、カテゴリ ラベルは表示されません。」
とありますので、横軸にラベルを表示しないということかと思っていた(動作を確実にしようと不要な表示を消したつもりだった)のですが、そう単純な話ではなかったようです。

とりあえず、これでグラフ化ができるようになりましたので、ASP.NETからの呼び出しやスケジュール化を試してみたいと思います。

お騒がせしました。

[ メッセージ編集済み 編集者: BT 編集日時 2007-05-01 11:44 ]
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2007-05-01 14:38
新たな問題が発生しましたので、再度投稿いたします。

先に解決したコードをASP.NETへコピーし、ファイルのパスをServer.MapPathを使うように変更したところ、

------------------------------------------------------------------------
クエリー実行エラー: チャートオブジェクトのメソッド ExportPicture を呼び出す際に予期しない内部エラーが発生しました。: 例外が発生しました。 [例外が発生しました。]
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Runtime.InteropServices.COMException: クエリー実行エラー: チャートオブジェクトのメソッド ExportPicture を呼び出す際に予期しない内部エラーが発生しました。: 例外が発生しました。 [例外が発生しました。]

------------------------------------------------------------------------
というエラーが発生します。
いろいろ探ってみたところ、以下のことが分かりました。

(1)クエリ文字のINTO,FROM句のファイルパスの指定を、前と同じC:/test/Log/〜という形式にするとWindows Application,ASP.NETともOK。
(2)開発時のウェブサイトはMy Documentsの配下のため、スペースを含むパスとなり問題があるということで、HELPに書いてあるとおり"'"(単一引用符)でパスを括りましたが、NG。
(3)試しに成功したC:/test/Log/〜を"'"で括ってもNG。
(4)CHARTではなくXML出力だと、My Documents配下でServer.MapPathを使っても"'"で括ればOK。括らなければNG。(つまりHELPのとおりの動作)

ということですので、CHART出力の場合、HELPの通りにパスを"'"で括ってはダメということになってしまいます。これはバグということでしょうか?それもと何か勘違いしてますでしょうか?でも、こんな基本的なバグだったら検索すれば何かしら情報が得られているような気がするので、私の勘違いのような気もするのですが。

ちなみに本番サーバではMy Documentsの下にウェブサイトが置かれることはないので、対応不能な問題ではありませんが、このままだと開発がやりにくくなるので、もし何か情報をお持ちの方がいらっしゃいましたらよろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)