サイトのログ ファイル内のカスタム フィールド <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 以降の既定のインストールに含まれています。
操作方法
カスタム フィールドの追加方法
次のようにインターネット インフォメーション サービス (IIS) マネージャーを開きます。
Windows Server 2012 R2 を使用している場合:
- タスク バーで、[サーバー マネージャー] をクリックし、[ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
Windows 8.1 を使用している場合:
- Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
- [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
[接続] ウィンドウで、サーバーを展開し、[サイト] を展開して、サイトを選びます。
[ログ記録] をダブルクリックします。
[ログ記録] ホーム ページの [形式] で、[W3C] を選びます。
[フィールドの選択] をクリックします。
[W3C ログ記録フィールド] ダイアログ ボックスで、[フィールドの追加] をクリックします。
[カスタム フィールドの追加] ダイアログ ボックスで、[フィールド名]に名前を入力し、[ソースの種類] で [要求ヘッダー]、[応答ヘッダー]、[サーバー変数] のいずれかを選びます。
[ソース] で、一覧からソースを選択するか、カスタム ソースの名前を入力します。
[OK] をクリックしてから、もう一度 [OK] をクリックします。
[操作] ペインで [適用] をクリックします。
カスタム フィールドの最大長を構成する方法
次のようにインターネット インフォメーション サービス (IIS) マネージャーを開きます。
Windows Server 2012 R2 を使用している場合:
- タスク バーで、[サーバー マネージャー] をクリックし、[ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。
Windows 8.1 を使用している場合:
- Windows キーを押しながら文字 X を押し、[コントロール パネル] をクリックします。
- [管理ツール] をクリックし、[インターネット インフォメーション サービス (IIS) マネージャー] をダブルクリックします。
[接続] ウィンドウでサーバーを選択してから、[管理] 領域の [構成エディター] をダブルクリックします。
構成エディターで、[セクション] として [system.applicationHost] を選び、次に [sites] を選びます。
[(コレクション)] をクリックし、省略記号をクリックします。
サイトを選び、logFile を展開し、customFields を展開して、maxCustomFieldLength をクリックします。
maxCustomFieldLength に、ログ ファイルのすべてのカスタム フィールドについて、1 フィールドに追加できるデータの最大量 (バイト) を入力します。
コレクション エディターを閉じてから、[操作] ウィンドウで [適用] をクリックします。
構成
<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'}