2012年12月20日木曜日

◆IISのログを取得する1(取得、圧縮、暗号化、分割)

最近の業務システムでは何かしらの形でIISが絡んでくることが多い。
ASP.NETやSilverlightやWCFなど。

そういったシステムで障害が起きた場合、Microsoftサポートへ問い合わせる事になるのだが、まずは大抵以下の情報が必要となる。

  1. イベントログ(evtxおよびtxt)
  2. IISアクセスログ
  3. HTTPErrorログ
  4. IIS構成情報

自分でサーバーから取ってくるのは大した作業ではないのだが、ユーザー先のサーバーで作業を依頼する場合には、纏めて取ってくるスクリプトがあれば便利そうだ。

という訳で、これらのログをある程度汎用的に取ってくるスクリプトを作ってみた。

機能的には、

  • イベントログ(System,application,security)のいずれかまたは全部を日付範囲指定(もしくは全部)で取得できる
  • IISアクセスログ、HTTPErrorログ、IIS構成情報を日付範囲指定して(もしくは全部)を取得できる
  • 業務システムで出力するログを取得できる
  • ログは纏めてzip圧縮可能
  • ログは暗号化可能
  • ログはメール送信を想定し指定サイズで分割可能
  • 対話実行のGUIをサポートする

といったあたりを考えている。

<設定ファイル>(GetLog.config)

対象ログのパス等を指定しておく設定ファイルを準備した。

こんな感じ

image

Eventlogs要素のtext属性
テキストのイベントログを同時に取得する場合はTrueを指定する。
Eventlogs要素のLog要素
「System」「Application」「Security」のログの種類を指定する。
IISLogs要素のlog要素
name属性にて該当のIISログ名称を指定する。
上記log要素のpath子要素
ログのパスを指定する。
上記log要素のday属性
ログの更新日範囲を指定。過去XX日の日数を指定する。

上記log要素のsaitename属性
IISアクセスログはサイトごとにログフォルダが判れているためサイト名を指定する。
サイト名からサイトIDを自動的に求めて以下の(id)部分を補いパスを算出する。
image

<root>
  <eventlogs text="false">
    <log name="system" />
    <log name="application" />
    <log name="security" />
  </eventlogs>
  <iislogs>
    <log name="IIS構成情報" >
      <path>C:\Windows\System32\inetsrv\config\*.config</path>
    </log>
    <log name="HTTPErrorログ"  day="120" >
      <path>C:\Windows\System32\Logfiles\HTTPERR\*</path>
    </log>    
    <log name="IISアクセスログ" day="30" sitename="SharePoint - 80"> 
      <path>C:\inetpub\logs\LogFiles\W3SVC(id)\*</path> 
    </log>   
  </iislogs>
</root>


<オプションダイアログ>(オプションダイアログ.ps1)

パラメータを指定して実行するパターンと、パラメータなしで実行してオプションダイアログを表示して選択させるパターンを想定しダイアログフォームを作った。
image


IIS構成情報以下のログファイル名は設定(config)ファイルを読み込み表示している。


Windowsフォームを扱うスクリプトは過去にも何度か使っていて特に難しいところはないので(若干面倒だが)ソースだけ記載する。


<ログ取得メイン>(GetLogメイン.ps1)

これが実際にログを取得する場合に実行するスクリプトです。


基本的には実処理を行う「分割.ps1」にパラメータをフォワードするだけですが、パラメータなしで実行された場合には先の「オプションダイアログ.ps1」を呼び出してパラメータ設定を行います。


直接パラメータを指定する方法は以下の通りimage


<ログ取得、圧縮、暗号化、分割>(分割.ps1)

実際にログの取得、圧縮、暗号化、分割を行っているスクリプト。


イベントログ抽出
イベントログの抽出保存部分についての説明は別途以下に記載した。
PowerShell: ◆イベントログを抽出して保存する


テキスト形式でのイベントログの保存については一応実装はしているのだが、テストしてみたところ、だいぶ重い処理となっており本番稼働中のサーバーで実行するとIISに影響が出るようだ。
もともとイベントビューワで保存しても数秒程度要する処理であることからサーバーで日中に取得するのはやめた方が良いかもしれない。
evtxファイルからテキストファイルの作成が可能なので、別途クライアントなどで取ってきたevtxファイルから作業するのが良さそうだ。
Log Parser 2.2 日本語版などのツールを使えば高速な取得が可能だがイベントビューワで取得したフォーマットに完全に一致させることができない)

ZIP圧縮
ZIP圧縮については以下で記載したSharpZipLibを使用した。
PowerShell: ◆SharpZipLibを使ってZip圧縮

暗号化
暗号化についても以下に別途記載した。
PowerShell: ◆ファイルを暗号化する


今回はカレントフォルダにキーファイル(Key.dat)および初期化ベクターファイル(IV.dat)があればそれを使用し、無ければハードコードしてある値を使用する。

分割
ファイル分割は単純に指定サイズで別ファイルに書き出していけば良いだけなのだが、バイナリーでの読み書きが必要となる。
バイナリーでの読み書きについては以下に記載した。
PowerShell: ◆バイナリファイルの読み書き

出力イメージ
パラメータで指定された場所に「ログyyyyMMdd_hhMMss」の名前でフォルダを作りその中にオリジナル(圧縮前)、圧縮、暗号化、分割の名前でそれぞれのファイルを作成している。


image

0 件のコメント:

コメントを投稿