サイトのログ ファイル内のカスタム フィールド <customFields>

概要

<logFile> 要素の <customFields> 要素は、W3C ログ内のカスタム フィールドのコレクションの構成設定を指定します。

IIS 8.5 を使用すると、標準のログ セットに加えて、カスタム フィールドをログできます。 これらのカスタム フィールドには、要求ヘッダー、応答ヘッダー、またはサーバー変数からのデータを含めることができます。 これらのフィールドをログするために、カスタム ログ モジュールを作成せずに、シンプルに構成プロパティを設定できます。 この機能は、サイト レベルでのみ使用できます。 カスタム フィールドを追加するには、ログ ファイル形式が W3C である必要があります。

カスタム フィールドが標準セットに追加されると、ログ ファイルにカスタム フィールドが含まれていることを示すために "_x" がファイル名に追加されます。 カスタム フィールドに追加されるデータの合計量が、65,536 バイトを超えることはできません。 カスタム ログ データがその量を超えると、IIS がデータを切り捨てます。 ログ ファイルのすべてのカスタム フィールドについて、1 フィールドに追加できるデータの最大量は、maxCustomFieldLength 属性によって指定されます。

カスタム フィールドを構成するには、フィールド名、ソース名、およびソースの種類を指定します。 カスタム情報をサーバー変数に格納し、サーバー変数をログできます。 ソースの種類を選択したら、既存のソース名を選択するか、新しいソース名を入力できます。

カスタム フィールドを使用すると、プロセスに関する有用なデータを収集し、IIS ログに集約できます。 ロード バランサーを含むシステムでは、ロード バランサーの IP アドレスがログに表示される場合がありますが、元の要求元がわかるように X-Forwarded-For ヘッダーをカスタム フィールドにログできます。 プロセスのアップタイムをログして、その日にプロセスが再起動された回数を確認できます。 メモリが過剰に使用され始めた場合は、メモリの消費を開始した時点、要求されたページ、クライアントの ID (悪意のある操作を行っている場合に特に役立ちます) を確認できます。

互換性

バージョン メモ
IIS 10.0 <customFields> 要素は IIS 10.0 では変更されませんでした。
IIS 8.5 <customFields> 要素が IIS 8.5 で導入されました。
IIS 8.0 該当なし
IIS 7.5 該当なし
IIS 7.0 該当なし
IIS 6.0 該当なし

段取り

<customFields> 要素は IIS 8.5 以降の既定のインストールに含まれています。

操作方法

カスタム フィールドの追加方法

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

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

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

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

  3. [ログ記録] をダブルクリックします。

  4. [ログ記録] ホーム ページの [形式] で、[W3C] を選びます。

  5. [フィールドの選択] をクリックします。

  6. [W3C ログ記録フィールド] ダイアログ ボックスで、[フィールドの追加] をクリックします。

  7. [カスタム フィールドの追加] ダイアログ ボックスで、[フィールド名]に名前を入力し、[ソースの種類][要求ヘッダー][応答ヘッダー][サーバー変数] のいずれかを選びます。

  8. [ソース] で、一覧からソースを選択するか、カスタム ソースの名前を入力します。

  9. [OK] をクリックしてから、もう一度 [OK] をクリックします。

  10. [操作] ペインで [適用] をクリックします。

    [ユーザー設定フィールドの追加] ダイアログ ボックスのスクリーンショット。

カスタム フィールドの最大長を構成する方法

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

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

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

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

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

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

  5. サイトを選び、logFile を展開し、customFields を展開して、maxCustomFieldLength をクリックします。

  6. maxCustomFieldLength に、ログ ファイルのすべてのカスタム フィールドについて、1 フィールドに追加できるデータの最大量 (バイト) を入力します。

  7. コレクション エディターを閉じてから、[操作] ウィンドウで [適用] をクリックします。

    logFile と customFields の展開されたメニュー選択が表示されている [プロパティ] ペインのスクリーンショット。

構成

<customFields> 要素は、サイト レベルで構成されます。

属性

属性 説明
maxCustomFieldLength 省略可能な uint 属性。

ログ ファイルのすべてのカスタム フィールドについて、1 フィールドに追加できるデータの最大量 (バイト)。

範囲は 2 から 65,536 です。 既定値は 4096 です。

子要素

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

W3C ログに追加されるカスタム フィールドの構成設定を指定します。

構成サンプル

次の構成例は、customFields 要素とその add 子要素を使用して、Default Web Site のカスタム フィールドのログ設定を指定します。

<sites>
    <site name="Default Web Site" id="1">
        <logFile logFormat="W3C" logTargetW3C="File, ETW">
            <customFields maxCustomFieldLength="4096">
                <clear />
                <add logFieldName="X-Forwarded-For" sourceName="X_FORWARDED_FOR" 
                    sourceType="RequestHeader" />
            </customFields>
        </logFile>
    </site>   
</sites>

サンプル コード

次の例は、サイトの W3C ログのカスタム フィールドを構成します。

AppCmd.exe

appcmd.exe set config  -section:system.applicationHost/sites /+"[name='ContosoSite'].logFile.customFields.[logFieldName='ContosoField',sourceName='ContosoSource',sourceType='ServerVariable']" /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", @"ContosoSite");

            if (siteElement == null) throw new InvalidOperationException("Element not found!");
            
            
            ConfigurationElement logFileElement = siteElement.GetChildElement("logFile");
            ConfigurationElement customFieldsElement = logFileElement.GetChildElement("customFields");
            ConfigurationElementCollection customFieldsCollection = customFieldsElement.GetCollection();
            
            ConfigurationElement addElement = customFieldsCollection.CreateElement("add");
            addElement["logFieldName"] = @"ContosoField";
            addElement["sourceName"] = @"ContosoSource";
            addElement["sourceType"] = @"ServerVariable";
            customFieldsCollection.Add(addElement);
            
            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", "ContosoSite")
         If (siteElement Is Nothing) Then
             Throw New InvalidOperationException("Element not found!")
         End If
         Dim logFileElement As ConfigurationElement = siteElement.GetChildElement("logFile")
         Dim customFieldsElement As ConfigurationElement = logFileElement.GetChildElement("customFields")
         Dim customFieldsCollection As ConfigurationElementCollection = customFieldsElement.GetCollection
         Dim addElement As ConfigurationElement = customFieldsCollection.CreateElement("add")
         addElement("logFieldName") = "ContosoField"
         addElement("sourceName") = "ContosoSource"
         addElement("sourceType") = "ServerVariable"
         customFieldsCollection.Add(addElement)
         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", "ContosoSite"]);
if (siteElementPos == -1) throw "Element not found!";
var siteElement = sitesCollection.Item(siteElementPos);

var logFileElement = siteElement.ChildElements.Item("logFile");
var customFieldsElement = logFileElement.ChildElements.Item("customFields");

var customFieldsCollection = customFieldsElement.Collection;

var addElement = customFieldsCollection.CreateNewElement("add");
addElement.Properties.Item("logFieldName").Value = "ContosoField";
addElement.Properties.Item("sourceName").Value = "ContosoSource";
addElement.Properties.Item("sourceType").Value = "ServerVariable";
customFieldsCollection.AddElement(addElement);


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", "ContosoSite"))
if (siteElementPos = -1) THEN throw "Element not found!"
Set siteElement = sitesCollection.Item(siteElementPos)

Set logFileElement = siteElement.ChildElements.Item("logFile")
Set customFieldsElement = logFileElement.ChildElements.Item("customFields")

Set customFieldsCollection = customFieldsElement.Collection

Set addElement = customFieldsCollection.CreateNewElement("add")
addElement.Properties.Item("logFieldName").Value = "ContosoField"
addElement.Properties.Item("sourceName").Value = "ContosoSource"
addElement.Properties.Item("sourceType").Value = "ServerVariable"
customFieldsCollection.AddElement(addElement)


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

PowerShell

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST'  -filter "system.applicationHost/sites/site[@name='ContosoSite']/logFile/customFields" -name "." -value @{logFieldName='ContosoField';sourceName='ContosoSource';sourceType='ServerVariable'}