例4:IISのアクセスログからHTMLを生成
例3のチャート(PageView.gif)だけでは見にくいので、見栄えの良いHTMLを生成してみましょう。
クエリの実行
例4の特徴は、HTMLに出力していることです。HTMLに出力するために、「テンプレート」という出力形式を利用しています。テンプレートファイルは、「ヘッダー」「本文」「フッター」という3つのセクションに分かれたテキストファイルで、「-tpl:」というパラメータで指定します。
LogParser -i:IISW3C -o:TPL -tpl:PageView.tpl "SELECT TOP 10 cs-uri-stem AS uri,COUNT(*) AS view INTO PageView.html FROM ex060221.log GROUP BY uri ORDER BY view DESC"
このクエリを実行すると、HTMLファイル「PageView.html」が生成されます。
テンプレート出力形式(-o:TPL)の設定
この例で使用したテンプレートファイル「PageView.tpl」の中身を見てみましょう(Log Parserでは通例的に「*.tpl」という拡張子をテンプレートファイルにつけます)。
<!-- ヘッダ部 --> <lpheader> <html> <head><title>アクセス集計</title></head> <body> <table border="1" cellpadding="2" cellspacing="2"> <tr> <th colspan="2" align="center">アクセス数TOP10</th> </tr> <tr> <th>ページ</th> <th>カウント</th> </tr> </lpheader> <!-- ボディ部 --> <lpbody> <tr> <td>%uri%</td> <td>%view%</td> </tr> </lpbody> <!-- フッタ部 --> <lpfooter> </table> <img src="PageView.gif" alt="チャート" width="768" heiight="576"><br /> </body> </html> </lpfooter>
「ヘッダー」に<lpheader>、「本文」に<lpbody>、「フッター」に<lpfooter>というタグを付加している以外は普通のHTMLであることがお分かりになると思います。そして、設定したい列名を「%uri%」「%view%」というように指定すると、値が埋め込まれたHTMLが出力されます。
例3と例4ではIISのログを例に紹介しましたが、「パフォーマンスログと警告」から出力できるCPU/メモリ使用率などからチャートやHTMLを生成することもできるでしょう。
例5:アプリケーションログをチェックしてメールで送信
最後の例として、アプリケーションのログをチェックして、過去10分以内に「FATAL」というレベルのエラーが発生していたら、メールで通知するという仕組みを作ってみましょう。
なお、この例では、WSH(Windows Scripting Host)というスクリプトを利用します。さらに、Windowsタスクを利用して監視の自動化を図ってみます。
テキストファイルの監視(TEXTLINE入力形式)
アプリケーションが出力するログは、一般的なテキストファイルです。
2006-06-23 17:37:58,608 [2768] FATAL MyTeam.Sample - 致命的なエラーです。 2006-05-27 20:43:45,618 [2768] ERROR MyTeam.Sample - 重大なエラーです。 2006-05-26 20:43:45,618 [2768] WARN MyTeam.Sample - 警告です。 2006-05-22 20:43:45,638 [2768] INFO MyTeam.MyProgram.Sample - 情報です。 2006-04-21 20:43:45,638 [2768] DEBUG MyTeam.MyProgram.Sample - デバッグです。
テキストファイルをリソースとして読み込むときは、「TEXTLINE」という入力形式を指定します。TEXTLINEの場合、次の列名を利用することができます。
名前 | 型 | 説明 |
LogFilename | STRING |
ファイルのフルパス |
Index | INTEGER |
行番号 |
Text | STRING |
テキスト行の内容 |
ここではText列のみ使用します。
テキストファイルから特定行を抽出するクエリ
ログファイル(sample.log)から「FATAL(致命的)」が含まれる行を抽出します。
LogParser -i:TEXTLINE -o:CSV "SELECT Text INTO CheckLogToMail.csv FROM sample.log WHERE Text Like '%FATAL%'"
このクエリでは、LIKE句を使用しています。LIKE句では、SQLと同様に「_」は任意の1文字、「%」は0個以上の文字列に一致します。ここでは、%を前後につけて前後方一致でチェックしています。
過去10分以内に発生したログを抽出するクエリ
さらに、過去10分以内に発生したログを抽出する条件を追加します。
LogParser -i:TEXTLINE -o:CSV "SELECT Text INTO CheckLogToMail.csv FROM sample.log WHERE Text Like '%FATAL%' AND TO_TIMESTAMP(SUBSTR(Text,0,19),'yyyy-MM-dd hh:mm:ss') >= TO_LOCALTIME( SUB( SYSTEM_TIMESTAMP(), TIMESTAMP( '10', 'mm' ) ) )"
このクエリでは、関数を利用しています。
関数の利用
基本構文に加えて、クエリでは関数を使って文字列操作や計算などを行うことができます。ここでは、次の5つの関数を利用しています(なお、関数の一覧は最後の補足にまとめています)。
TO_TIMESTAMP(文字列,書式)
……文字列を書式日時に変換SUBSTR(文字列,開始位置,文字数)
……指定位置から長さ分の部分文字列を抽出TO_LOCALTIME
……世界協定時刻(UTC)から現地時刻に変換SUB(値1,値2)
……2つの値(数値/文字/日時)の差を計算SYSTEM_TIMESTAMP()
……世界協定時刻(UTC)のシステム日時
まず「TO_TIMESTAMP(SUBSTR(Text,0,19),'yyyy-MM-dd hh:mm:ss')
」でログの発生時刻を取得します。ログファイルの先頭から19文字をSUBSTR
関数で取得し、さらにTO_TIMESTAMP
関数でTIMESTAMP
データ型へ変換しています。
次に「TO_LOCALTIME( SUB( SYSTEM_TIMESTAMP(), TIMESTAMP( '10', 'mm' ) ) )
」で過去10分間を取得します。SYSTEM_TIMESTAMP
の世界協定現在時刻からSUB
関数で10分を引きます。そして、日本の時刻に変換するTO_LOCALTIME
関数を実行します。
この2つの値を比較し、過去10分以内の発生であるかをチェックしています。