Web サイトのログ ファイル <logFile>

概要

<site> 要素の <logFile> 要素には、IIS 7 以降のサイトのログ記録を構成できる属性が含まれています。

たとえば、ログ記録を有効または無効にしたり、IIS ログ ファイルの形式を構成したり、ログ ファイルに格納する情報のカテゴリを指定したり、ログ ファイルが格納されるディレクトリを変更したりできます。 また <logFile> 要素を使用して、ログ ファイルのサイズまたは時間間隔のいずれかに基づいて IIS で新しいログ ファイルが作成される頻度を制御したり、ログ ファイルが到達可能な最大サイズ (バイト単位) を制御したりできます。

既定では、IIS 7 以降では World Wide Web Consortium (W3C) ログ ファイル形式が使用されます。 この設定を変更するには、logFormat 属性を IISNCSA、または Custom に変更します。

Note

ODBC ログは、IIS 7 以降ではカスタム ログ モジュールとして実装されています。 その結果、IIS 7 以降で ODBC ログを有効にして構成するには、次の 2 つの個別のアクションが必要です。

  • <odbcLogging> 要素内の ODBC ログ属性を設定します。 これらの属性では、ODBC 接続のシステム データ ソース名 (DSN)、テーブル名、ユーザー名、およびパスワードを指定します。
  • <logFile> 要素で適切なカスタム ログ属性を設定します。 これらの属性では、ログ ファイル形式を "Custom" に設定し、カスタム ログ プラグイン クラス ID を "{FF16065B-DE82-11CF-BC0A-00AA006111E0}" に設定する必要があります。

ODBC ログの詳細については、<odbcLogging> 要素を参照してください。

logExtFileFlags 属性を編集することで、IIS がログに記録する情報のカテゴリを定義できます。 既定値は、DateTimeClientIPUserNameServerIPMethodUriStemUriQueryTimeTakenHttpStatusWin32StatusServerPortUserAgentHttpSubStatusReferer です。

Note

特定のサイトに対して <logFile> セクションと <siteDefaults> セクションの両方で <site> 要素が構成されている場合は、<site> セクションの構成がそのサイトに対して使用されます。

IIS 8.5 を使用すると、標準のログ記録セットに加えて、カスタム フィールドをログに記録できます。 カスタム フィールドを追加するには、ログ ファイル形式が W3C である必要があります。 詳細については、customFieldsを参照してください。

互換性

バージョン メモ
IIS 10.0 <logFile> 要素は、IIS 10.0 では変更されませんでした。
IIS 8.5 ログ ファイルにフラッシュされる前にバッファーに格納するイベントの数を指定する flushByEntryCountW3CLog 属性を追加しました。 ログに記録された IIS イベントの処理方法を指定する logTargetW3C 属性を追加しました。 ログ ファイル内の行の最大長を指定する maxLogLineLength 属性を追加しました。 <customFields> 子要素を追加しました。
IIS 8.0 -sitename フィールドの内容を指定するために logSiteId 属性が追加され、logExtFileFlags 属性の既定値に referer フラグが追加されました。
IIS 7.5 <logFile> 要素は、IIS 7.5 では変更されませんでした。
IIS 7.0 <site> 要素の <logFile> 要素が IIS 7.0 で導入されました。
IIS 6.0 <logFile> 要素は、IIS 6.0 IIsWebService メタベース オブジェクトのログ プロパティのセクションを置き換えます。

段取り

<logFile> 要素が IIS 7 以降の既定のインストールに含められます。

操作方法

サイトのログ設定を編集する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 または Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8 または Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
    • Windows Server 2008 または Windows Server 2008 R2 を使用している場合:

      • タスク バーで、[スタート] ボタンをクリックし、[管理ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows Vista または Windows 7 を使用している場合:

      • タスク バーで、[スタート][コントロール パネル] の順にクリックします。
      • [管理ツール] をダブルクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウでサーバー名を展開し、[サイト] を展開してから、ログ記録を構成する Web サイトをクリックします。

  3. [ホーム] ウィンドウで、[ログ記録] をダブルクリックします。
    Screenshot of the Default Web Site Home page. The icon for Logging is highlighted.

  4. [ログ記録] ウィンドウの [形式] ボックスで、ログ ファイル形式を選択し、ログ ファイルを格納するディレクトリへのパスを [ディレクトリ] ボックスに入力するか、[参照...] をクリックして、ログ ファイルを格納するディレクトリを選択します。
    Screenshot of the Logging page within I I S Manager.

  5. W3C ログ ファイル形式を使用する場合:

    • ログに記録する情報の種類を選択するために、[フィールドの選択] をクリックします。
    • [W3C ログ記録フィールド] ダイアログ ボックスで、ログに記録するオプションのチェック ボックスをオンにし、ログに記録しないオプションのチェック ボックスをオフにして、[OK] をクリックします。
      Screenshot of the W 3 C Logging Fields dialog box.

W3C ログに対して ETW またはファイル ログを構成する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウで、サーバー名を展開し、[サイト] を展開して、サイトを選びます。

  3. サイトのホーム ウィンドウで、[ログ記録] をダブルクリックします。

  4. [ログ記録] ホーム ページの [ログのイベントの保存先] で、[ログ ファイルのみ][ETW イベントのみ]、または [ログ ファイルと ETW イベントの両方] を選択します。

    Screenshot of the I I S Manager window displaying the Logging page.

エントリ数による W3C ログのフラッシュを構成する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウでサーバーを展開し、[構成エディター] をダブルクリックします。

  3. 構成エディター[セクション] で、system.applicationHost を展開し、次に [sites] を選びます。

  4. [(コレクション)] をクリックし、省略記号をクリックします。

  5. 構成するサイトを選択し、logFile を展開します。

  6. flushByEntryCountW3Clog について、ログ ファイルにフラッシュされる前にバッファーに格納するイベントの数を入力します。

  7. [操作] ウィンドウで [適用] をクリックします。

    Screenshot of the Collection Editor Window. Flush By Entry Count W 3 C Log is highlighted in the Properties field.

ログの行の最大長を構成する方法

  1. インターネット インフォメーション サービス (IIS) マネージャーを開きます。

    • Windows Server 2012 R2 を使用している場合:

      • タスク バーで、[サーバー マネージャー] をクリックし、[ツール][インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
    • Windows 8.1 を使用している場合:

      • Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
      • [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
  2. [接続] ウィンドウでサーバーを展開し、[構成エディター] をダブルクリックします。

  3. 構成エディター[セクション] で、system.applicationHost を展開し、次に [sites] を選びます。

  4. [(コレクション)] をクリックし、省略記号をクリックします。

  5. 構成するサイトを選択し、logFile を展開します。

  6. maxLogLineLength について、ログ ファイルの 1 行の最大バイト数を入力します。

  7. [操作] ウィンドウで [適用] をクリックします。

    Screenshot of the Collection Editor window. Max Log Line Length is highlighted in the Properties field.

構成

属性

属性 説明
customLogPluginClsid 省略可能な文字列属性。

カスタム モジュールに対する 1 つ以上の COM オブジェクト クラス ID (CLSID) を、優先順位に従って指定します。
directory 省略可能な文字列属性。

ログ ファイルとログ関連のサポート ファイルが格納されるログ ディレクトリを指定します。

既定値は %SystemDrive%\inetpub\logs\LogFiles です。
enabled 省略可能な Boolean 属性です。

サイトのログ記録が有効 (true) か無効 (false) かを指定します。

注: ASP エラーおよび ODBC エラーは IIS ログ ファイルに記録されません。

既定値は true です。
flushByEntryCountW3CLog 省略可能な uint 属性。

ログ ファイルにフラッシュされる前にバッファーに格納するイベントの数を指定します。 数値を小さくすると、イベントがより迅速にフラッシュされますが、ディスク操作の回数が増えた結果としてパフォーマンスが犠牲になります。 さらにリアルタイムなトラブルシューティングを行うにはこの値を減らし、パフォーマンスを向上させるにはこれを増やします。 0 の値は、フラッシュが既定の最大値の 64k で発生することを指定します。

既定値は 0 です。
localTimeRollover 省略可能な Boolean 属性です。

新しいログ ファイルがローカル時刻または協定世界時 (UTC) (以前はグリニッジ標準時 (GMT) と呼ばれていました) のどちらに基づいて作成されるかを指定します。 false の場合、新しいログ ファイルは UTC に基づいて作成されます。

注: 設定に関係なく、W3C 拡張ログの各ログ レコードについてのタイム スタンプは UTC ベースです。

既定値は false です。
logExtFileFlags 省略可能なフラグ属性。

サイトのイベントをログに記録するときに、ログ ファイル (W3C 拡張ログ ファイル形式を使う場合) または ODBC データ ソースに書き込まれる情報のカテゴリを指定します。 logExtFileFlags 属性には、次の値のうち 1 つ以上を指定できます。 複数の値を指定する場合は、コンマ (,) で区切ります。

既定値は DateTimeClientIPUserNameServerIPMethodUriStemUriQueryTimeTakenHttpStatusWin32StatusServerPortUserAgentHttpSubStatusReferer です。
Value 説明
BytesRecv サーバーが受信したバイト数をログに記録します。
BytesSent サーバーが送信したバイト数をログに記録します。
ClientIP 要求を作成したクライアントの IP アドレスをログに記録します。
ComputerName ログ ファイルのエントリが生成されたサーバーの名前をログに記録します。
Cookie コンテンツが存在する場合は、受信した Cookie の内容をログに記録します。
Date アクティビティが発生した日付をログに記録します。
Host 存在する場合は、ホスト ヘッダー名をログに記録します。
HttpStatus HTTP 状態コードをログに記録します。
HttpSubStatus HTTP エラーのサブ状態コードをログに記録します。 たとえば、500.18 HTTP エラーの場合、状態コードは 500、サブ状態コードは 18 です。
Method 要求されたアクションをログに記録します。 たとえば、GETPOST などです。
ProtocolVersion クライアントが使用したプロトコルのバージョンをログに記録します。
Referer ユーザーが最後にアクセスしたサイトをログに記録します。 このサイトにより、現在のサイトへのリンクが用意されました。
ServerIP ログ ファイルのエントリが生成されたサーバーの IP アドレスをログに記録します。
ServerPort サイトに構成されているサーバーのポート番号をログに記録します。
SiteName サイトのインターネット サービス名とインスタンス番号をログに記録します。
Time アクティビティが発生した時刻を協定世界時 (UTC) でログに記録します。
TimeTaken 要求が完了するまでにかかった時間の長さをログに記録します。 かかった時間はミリ秒単位で記録されます。

: クライアント要求のタイムスタンプは、HTTP.sys が最初のバイトを受け取ったが、HTTP.sys が要求の解析を開始する前に初期化されます。 クライアント要求のタイムスタンプは、最後の IIS 送信が完了すると停止します。 かかった時間には、ネットワークを横切る時間は反映されません。 サイトへの最初の要求では、他の同様の要求よりも少し長い時間が表示されます。これは、最初の要求を含むログ ファイルが HTTP.sys によって開くためです。
UriQuery クライアントが試行していたクエリをログに記録します (存在する場合)。 Uniform Resource Identifier (URI) クエリは動的ページにのみ必要であり、通常は URL に渡されるパラメーターで構成されます。
UriStem アクションのターゲットであるユニバーサル リソース識別子 (URI) のステム情報をログに記録します。 たとえば、Default.htm などです。
UserAgent クライアントが使用したブラウザーの種類をログに記録します。
UserName サーバーにアクセスした認証済みユーザーの名前をログに記録します。 匿名ユーザーはハイフンで示されます。
Win32Status Windows 状態コードをログに記録します。
logFormat 省略可能な列挙型属性。

ログ ファイルの形式を指定します。 logFormat 属性には、次のいずれかの値を指定できます。

既定値は W3C です。
Value 説明
Custom カスタム ログ モジュール用のカスタム ログ ファイル形式を使用します。

数値は 3 です。
IIS Microsoft IIS ログ ファイル形式を使用して、サイトに関する情報を記録します。 この形式は、HTTP.sys によって処理される、 固定の ASCII テキストベースの形式です。つまり、ログに記録されるフィールドをカスタマイズできません。 フィールドはコンマで区切られ、時刻は現地時間で記録されます。 次に、IIS ログ ファイルの形式を使用するときにログに記録されるフィールドの一覧を示します。
  • クライアント IP アドレス
  • ユーザー名
  • 日付
  • 時刻
  • サービスとインスタンス
  • サーバー名
  • サーバー IP アドレス
  • 所要時間
  • 送信されたクライアント バイト数
  • 送信されたサーバー バイト数
  • Service status code (200 という値は、要求が正常に完了したことを示します。)
  • Windows status code (0 という値は、要求が正常に完了したことを示します。)
  • 要求の種類
  • 操作のターゲット
  • パラメーター (スクリプトに渡されるパラメーター)
すべてのフィールドにデータがあるとは限りません。 フィールドにデータがない場合には、プレース ホルダーとしてハイフン (-) が表示されます。 フィールドに印刷不可能な文字が含まれている場合、HTTP.sys によりその文字はプラス記号 (+) に置き換えられ、ログ ファイル形式が保持されます。

数値は 0 です。
NCSA National Center for Supercomputing Applications (NCSA) の共通ログ ファイル形式を使用して、サイトに関する情報を記録します。 この形式は、HTTP.sys によって処理される、 固定の ASCII テキストベースの形式です。つまり、ログに記録されるフィールドをカスタマイズできません。 フィールドはスペースで区切られ、時刻は協定世界時 (UTC) とのオフセットと共に現地時間で記録されます。 次に、NCSA 共通ログ ファイルの形式を使用するときにログに記録されるフィールドの一覧を示します。
  • リモート ホスト アドレス
  • Remote log name (この値は常にハイフンです。)
  • ユーザー名
  • 日付、時刻、および UTC オフセット
  • 要求とプロトコルのバージョン
  • Service status code (200 という値は、要求が正常に完了したことを示します。)
  • 送信バイト数
すべてのフィールドにデータがあるとは限りません。 フィールドにデータがない場合には、プレース ホルダーとしてハイフン (-) が表示されます。 フィールドに印刷不可能な文字が含まれている場合、HTTP.sys によりその文字はプラス記号 (+) に置き換えられ、ログ ファイル形式が保持されます。

数値は 1 です。
W3C W3C 拡張ログ ファイル形式を使用して、サイトに関する情報を記録します。 この形式は、HTTP.sys によって処理される、 カスタマイズ可能な ASCII テキストベースの形式です。つまり、ログに記録されるフィールドを指定できます。 logExtFileFlags 属性に記録されるフィールドを指定します。 フィールドはスペースで区切られ、時刻は協定世界時 (UTC) で記録されます。

数値は 2 です。
logSiteId 省略可能な Boolean 属性です。

s-sitename フィールドにサイト名 (false) またはサイト ID (true) のいずれを含めるかを指定します。 プロパティごとに 1 つのログ ファイルが Site に設定されている場合 (既定の設定)、ログ ファイル名プロパティには代わりにサイト ID が含まれるため、既定ではログ ファイルに s-sitename 列は表示されません。 プロパティごとに 1 つのログ ファイルが Serverに設定されている場合、s-sitename 列は既定でログ ファイルに含まれます。

既定値は True です。つまり、s-sitename フィールドにはサイト ID が含まれます。 代わりにサイト名をログに記録するには、logSiteID を False に設定します。
logTargetW3C 省略可能なフラグ属性。

IIS で、ログに記録された IIS イベントの処理に Windows イベント トレーシング (ETW) またはファイル ログあるいはその両方を使用するかどうかを指定します。 ETW ではリアルタイムなログ記録が提供され、ETW プロバイダーと標準クエリ メカニズムが使用されます。 ファイル ログでは、イベント データはログ データにアクセスするために解析できるテキスト ファイルに格納されます。

IIS でログ ファイルを使用する場合、HTTP.sys ではデータはトランザクションの完了後にテキスト ログ ファイルに直接記録されます。 ETW を使用する場合、HTTP.sys ではデータは iislogging プロバイダーを使用して ETW に送信され、LOGSVC サービスでは、ETW のデータのクエリやワーカー プロセスからのデータの直接収集、ログ ファイルへのデータの送信などのログ データの管理を行います。

logTargetW3C 属性には次の値を指定できます。 既定値は File です。 applicationHost.config でサイトの logTargetW3CFileETW の両方が表示されている場合、これは IIS マネージャーの [ログ] ウィンドウで、サイトのログ ファイル設定に対して [ログ ファイルと ETW イベントの両方] を選択することと同じです。
Value 説明
File IIS イベント データはテキスト ログ ファイルに格納されます。 イベント データを処理するには、テキスト ベースのログ ファイルを解析する必要があります。 テキスト ログ ファイルの処理とフラッシュには時間がかかるため、イベント データをリアルタイムで処理することはできません。

数値は 1 です。
ETW IIS ではデータをテキスト ファイルに直接ログ記録する代わりに、ログに記録された情報は、Windows に組み込まれている汎用イベント メカニズムである Windows イベント トレーシングに送信されます。 メッセージ アナライザーなどの標準クエリ ツールややカスタム ツールを使用して、ログに記録されたデータを管理できます。 ETW では、ログに記録された情報がリアルタイムで処理されるため、ユーザーはデータをフィルター処理して表示したり、ログ記録を動的に有効または無効にしたりできます。 また、ETW では詳細な情報がイベント データに追加され、HTTP.sys でアクセスできないデータが提供されます。 詳細については、「イベント トレーシング」を参照してください。

数値は 2 です。
maxLogLineLength 省略可能な uint 属性。

ログ ファイル内の行の最大長を指定します。 これにより、特にカスタム ログ フィールドを追加するときに、ログ記録によって蓄積されるデータの量を制限し、ディスク領域を節約できます。

範囲は 2 から 65,536 です。 既定値は 65536 です。
period 省略可能な列挙型属性。

IIS で新しいログ ファイルを作成する頻度を指定します。 period 属性には、次のいずれかの値を指定できます。

既定値は Daily です。
Value 説明
Daily 新しいログ ファイルを毎日作成します。

数値は 1 です。
Hourly 新しいログ ファイルを 1 時間ごとに作成します。

数値は 4 です。
MaxSize 最大サイズに達したときに、新しいログ ファイルを作成します。 最大サイズは truncateSize 属性で指定します。

数値は 0 です。
Monthly 新しいログ ファイルを毎月作成します。

数値は 3 です。
Weekly 新しいログ ファイルを毎週作成します。

数値は 2 です。
truncateSize 省略可能な int64 属性。

新しいログ ファイルを作成するまでのログ ファイルの最大サイズ (バイト単位) を指定します。 この値は、period 属性に MaxSize が選ばれている場合にのみ適用されます。 最小ファイル サイズは 1,048,576 バイトです。 この属性を 1,048,576 バイト未満の値に設定すると、既定値は暗黙的に 1,048,576 バイトと見なされます。

既定値は 20971520 です。

子要素

要素 説明
customFields 省略可能な要素です。

W3C ログ内のカスタム フィールドのコレクションの構成設定を指定します。

構成サンプル

次の構成例では、<logFile> 要素のlogExtFileFlags 属性を使用して、Contoso という名前の Web サイトについて IIS でログに記録する設定を指定します。 period 属性により、IIS では 1 時間ごとに新しい W3C ログ ファイルが作成されます。localTimeRollover 属性によって、新しいログ ファイルを作成して名前を付けるタイミングを決定するために、IIS でローカル サーバー上の時刻を使用することが指定されます。

<site name="Contoso" id="2" serverAutoStart="true">
   <application path="/" applicationPool="Contoso">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:80:www.contoso.com" />
   </bindings>
   <logFile
      period="Hourly"
      localTimeRollover="true"
      logExtFileFlags="Date, Time, ClientIP, UserName, ServerIP, Method, UriStem, UriQuery, HttpStatus, TimeTaken, ServerPort, UserAgent, HttpSubStatus" />
</site>

サンプル コード

次の例では、Contoso という名前のサイトのログ記録を構成します。 それぞれの例では、サイトのログ記録が有効になり、新しいログ ファイルを毎日生成するようにサイト ログが構成されます。 また、ローカル サーバー上の時刻を使用してログ ファイル名を生成し、新しいログ ファイルを生成するタイミングを決定するように IIS を構成します。

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.logFormat:"W3C" 
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.period:"Daily" 
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.localTimeRollover:"True" 
appcmd.exe set config -section:system.applicationHost/sites /[name='Contoso'].logFile.enabled:"True" /commit:apphost

Note

AppCmd.exe を使用してこれらの設定を構成する場合は、commit パラメーターを必ず apphost に設定する必要があります。 これにより、ApplicationHost.config ファイルの適切な場所セクションに構成設定がコミットされます。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();

         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");
         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElement logFileElement = siteElement.GetChildElement("logFile");
         logFileElement["logFormat"] = @"W3C";
         logFileElement["period"] = @"Daily";
         logFileElement["localTimeRollover"] = true;
         logFileElement["enabled"] = true;

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
       Dim serverManager As ServerManager = New ServerManager
       Dim config As Configuration = serverManager.GetApplicationHostConfiguration
       Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
       Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
       Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")

       If (siteElement Is Nothing) Then
          Throw New InvalidOperationException("Element not found!")
       End If

       Dim logFileElement As ConfigurationElement = siteElement.GetChildElement("logFile")
       logFileElement("logFormat") = "W3C"
       logFileElement("period") = "Daily"
       logFileElement("localTimeRollover") = True
       logFileElement("enabled") = True

       serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;

var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);
if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var logFileElement = siteElement.ChildElements.Item("logFile");
logFileElement.Properties.Item("logFormat").Value = "W3C";
logFileElement.Properties.Item("period").Value = "Daily";
logFileElement.Properties.Item("localTimeRollover").Value = true;
logFileElement.Properties.Item("enabled").Value = true;

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = createObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))

If siteElementPos = -1 Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set logFileElement = siteElement.ChildElements.Item("logFile")
logFileElement.Properties.Item("logFormat").Value = "W3C"
logFileElement.Properties.Item("period").Value = "Daily"
logFileElement.Properties.Item("localTimeRollover").Value = True
logFileElement.Properties.Item("enabled").Value = True

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function