Freigeben über


Benutzerdefinierte Felder in einer Protokolldatei für eine Site <customFields>

Übersicht

Das <customFields>-Element des <logFile>-Elements gibt die Konfigurationseinstellungen für eine Sammlung von benutzerdefinierten Feldern in einem W3C-Protokoll (World Wide Web Consortium) an.

In IIS 8.5 können Sie zusätzlich zu den standardmäßig protokollierten Feldern auch benutzerdefinierte Felder protokollieren. Diese benutzerdefinierten Felder können Daten aus Anforderungsheadern, Antwortheadern oder Servervariablen enthalten. Um diese Felder zu protokollieren, können Sie einfach Konfigurationseigenschaften festlegen, anstatt ein benutzerdefiniertes Protokollierungsmodul zu erstellen. Dieses Feature ist nur auf Siteebene verfügbar. Das Protokolldateiformat muss auf W3C festgelegt sein, wenn Sie benutzerdefinierte Felder hinzufügen möchten.

Wenn dem Standardsatz ein benutzerdefiniertes Feld hinzugefügt wurde, wird „_x“ an den Dateinamen angefügt, um anzuzeigen, dass die Protokolldatei ein benutzerdefiniertes Feld enthält. Die Gesamtmenge der in benutzerdefinierten Feldern hinzugefügten Daten darf 65.536 Byte nicht überschreiten. IIS schneidet die Daten ab, wenn die benutzerdefinierten protokollierten Daten diese Menge überschreiten. Die maximale Datenmenge, die einer Protokolldatei in einem benutzerdefinierten Feld hinzugefügt werden kann, wird durch das maxCustomFieldLength-Attribut angegeben.

Um ein benutzerdefiniertes Feld zu konfigurieren, geben Sie den Feldnamen, den Quellnamen und den Quelltyp an. Sie können benutzerdefinierte Informationen in eine Servervariable einfügen und die Servervariable protokollieren. Nachdem Sie den Quelltyp ausgewählt haben, können Sie entweder einen vorhandenen Quellnamen auswählen oder einen neuen Quellnamen eingeben.

Benutzerdefinierte Felder ermöglichen es Ihnen, nützliche Daten über den Prozess zu sammeln und sie in die IIS-Protokolle zu aggregieren. In einem System, das einen Lastenausgleich enthält, wird möglicherweise die IP-Adresse des Lastenausgleichs im Protokoll angezeigt, Sie können jedoch den X-Forwarded-For-Header in einem benutzerdefinierten Feld protokollieren, damit Sie den ursprünglichen Anforderer kennen. Sie können die Prozessbetriebszeit protokollieren, um zu sehen, wie oft der Prozess im Laufe des Tages neu gestartet wurde. Wenn der Prozess beginnt, übermäßig viel Arbeitsspeicher zu nutzen, können Sie feststellen, ab wann Arbeitsspeicher verbraucht wurde, welche Seite angefordert wurde und wie die ID des Clients lautet (was insbesondere bei schädlichen Aktivitäten nützlich ist).

Kompatibilität

Version Hinweise
IIS 10.0 Das <customFields> Element wurde in IIS 10.0 nicht geändert.
IIS 8.5 Das <customFields>-Element wurde in IIS 8.5 eingeführt.
IIS 8.0 N/V
IIS 7.5 N/V
IIS 7.0 N/V
IIS 6.0 N/V

Setup

Das <customFields>-Element ist in der Standardinstallation von IIS 8.5 und höher enthalten.

Gewusst wie

Hinzufügen von benutzerdefinierten Feldern

  1. Öffnen Sie den Internet Information Services (IIS) Manager:

    • Vorgehensweise unter Windows Server 2012 R2:

      • Klicken Sie auf der Taskleiste auf Server-Manager, dann auf Tools und danach auf Internetinformationsdienste-Manager (IIS).
    • Vorgehensweise unter Windows 8.1:

      • Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf "Systemsteuerung".
      • Klicken Sie auf Verwaltungund doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
  2. Erweitern Sie im BereichVerbindungen den Server, erweitern Sie Websites, und wählen Sie dann eine Website aus.

  3. Doppelklicken Sie auf Protokollierung.

  4. Wählen Sie auf der Startseite Protokollierung für Format die Option W3C aus.

  5. Klicken Sie auf Felder auswählen.

  6. Klicken Sie im Dialogfeld W3C-Protokollierungsfelder auf Feld hinzufügen.

  7. Geben Sie im Dialogfeld Benutzerdefiniertes Feld hinzufügen einen Namen in Feldnamenein, und wählen Sie einen der folgenden Optionen für den Quelltypaus: Anforderungsheader,Antwortheader oder Servervariable.

  8. Wählen Sie in Quelle eine Quelle aus der Liste aus, oder geben Sie den Namen einer benutzerdefinierten Quelle ein.

  9. Klicken Sie auf OK und dann erneut auf OK.

  10. Klicken Sie im Bereich Aktion auf Anwenden.

    Screenshot of the Add Custom Field dialog box.

Konfigurieren der maximalen Länge des benutzerdefinierten Felds

  1. Öffnen Sie den Internet Information Services (IIS) Manager:

    • Vorgehensweise unter Windows Server 2012 R2:

      • Klicken Sie auf der Taskleiste auf Server-Manager, dann auf Tools und danach auf Internetinformationsdienste-Manager (IIS).
    • Vorgehensweise unter Windows 8.1:

      • Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf "Systemsteuerung".
      • Klicken Sie auf Verwaltungund doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
  2. Wählen Sie im Bereich Verbindungen den Server aus, und doppelklicken Sie dann im Bereich Verwaltung auf Konfigurations-Editor.

  3. Wählen Sie im Konfigurations-Editor für den Abschnittsystem.applicationHost und dann Sites aus.

  4. Klicken Sie auf (Sammlung) und dann auf die Auslassungspunkte.

  5. Wählen Sie die Website aus, erweitern Sie logFile, erweitern Sie customFields, und klicken Sie dann auf maxCustomFieldLength.

  6. Geben Sie für maxCustomFieldLength die maximale Datenmenge (in Byte) ein, die einer Protokolldatei in einem benutzerdefinierten Feld hinzugefügt werden kann.

  7. Schließen Sie den Auflistungs-Editor, und klicken Sie dann im Aktionsbereich auf Anwenden.

    Screenshot of the Properties pane displaying the expanded menu selections for logFile and customFields.

Konfiguration

Das <customFields>-Element wird auf Websiteebene konfiguriert.

Attribute

Attribut Beschreibung
maxCustomFieldLength Optionales Uint-Attribut.

Die maximale Datenmenge (in Byte), die einer Protokolldatei in einem benutzerdefinierten Feld hinzugefügt werden kann.

Der gültige Bereich ist 2 bis 65.536. Der Standardwert ist 4096.

Untergeordnete Elemente

Element Beschreibung
add Optionales Element.

Gibt die Konfigurationseinstellungen für ein benutzerdefiniertes Feld an, das einem W3C-Protokoll hinzugefügt wurde.

Konfigurationsbeispiel

Im folgenden Konfigurationsbeispiel wird das customFields Element und das untergeordnete add Element verwendet, um die Einstellungen des benutzerdefinierten Protokollfelds für die Standardwebsite anzugeben.

<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>

Beispielcode

In den folgenden Beispielen werden benutzerdefinierte Felder für ein W3C-Protokoll für eine Website konfiguriert.

AppCmd.exe

appcmd.exe set config  -section:system.applicationHost/sites /+"[name='ContosoSite'].logFile.customFields.[logFieldName='ContosoField',sourceName='ContosoSource',sourceType='ServerVariable']" /commit:apphost

Hinweis

Sie müssen unbedingt den Commitparameterapphost festlegen, wenn Sie AppCmd.exe verwenden, um diese Einstellungen zu konfigurieren. Dadurch werden die Konfigurationseinstellungen auf den entsprechenden Speicherortabschnitt in der Datei ApplicationHost.config festgelegt.

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'}