Freigeben über


Hinzufügen von benutzerdefinierten Feldern zu einer Protokolldatei für eine Website <add>

Übersicht

Das <add> Element unter dem <customField> Element steuert die Konfigurationseinstellungen für ein benutzerdefiniertes Feld für ein W3C-Protokoll für eine Website.

Mit IIS 8.5 können Sie zusätzlich zum standardmäßigen protokollierten Satz 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 Websiteebene verfügbar. Das Protokolldateiformat muss W3C sein, um benutzerdefinierte Felder hinzuzufügen.

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 mit einem Load Balancer sehen Sie möglicherweise die IP-Adresse des Load Balancers im Protokoll, aber Sie können den X-Forwarded-For-Header in einem benutzerdefinierten Feld protokollieren, damit Sie wissen, wer der ursprüngliche Anforderer war. Sie können die Prozesszeit protokollieren, um zu sehen, wie oft der Prozess während des Tages neu gestartet wurde. Wenn der Speicher übermäßig stark beansprucht wird, können Sie feststellen, zu welchem Zeitpunkt der Speicher verbraucht wurde, welche Seite angefordert wurde und wie die ID des Clients lautete (was insbesondere bei böswilligen Aktivitäten nützlich ist).

Kompatibilität

Version Hinweise
IIS 10.0 Das <add> Element wurde in IIS 10.0 nicht geändert.
IIS 8.5 Das <add> 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 <add> 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:

    • Wenn Sie Windows Server 2012 R2 verwenden:

      • Klicken Sie in der Taskleiste auf Server-Manager, dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
    • Bei Verwendung von Windows Server 8.1:

      • Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf Systemsteuerung.
      • Klicken Sie auf Verwaltung und 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 Feldnamen ein, und wählen Sie einen der folgenden Optionen für den Quelltyp aus: 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 zuerst auf OK und dann erneut auf OK.

  10. Klicken Sie im Bereich Aktion auf Anwenden.

    Screenshot of Add Custom Field dialog box with Request Header selected in the Source field.

Konfigurieren der maximalen Länge des benutzerdefinierten Felds

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

    • Wenn Sie Windows Server 2012 R2 verwenden:

      • Klicken Sie in der Taskleiste auf Server-Manager, dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
    • Bei Verwendung von Windows Server 8.1:

      • Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf Systemsteuerung.
      • Klicken Sie auf Verwaltung und 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 Verwaltungsbereich auf Konfigurations-Editor.

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

  4. Klicken Sie auf (Auflistung) 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 ein, die einer Protokolldatei in einem benutzerdefinierten Feld in Byte hinzugefügt werden kann.

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

    Screenshot of log File with Custom Fields expanded and max Custom Field Length selected.

Konfiguration

Das <add> Element wird auf Websiteebene konfiguriert.

Attribute

Attribut Beschreibung
logFieldName Erforderliches Zeichenfolgenattribut.

Gibt das benutzerdefinierte Feld an, das der Protokolldatei hinzugefügt werden soll. Der Feldname darf keine Leerzeichen enthalten.
sourceName Erforderliches Zeichenfolgenattribut.

Gibt den Namen der HTTP-Header- oder Servervariable an, die Werte enthält, die einem benutzerdefinierten Feld des Protokolls hinzugefügt werden sollen. Der Name kann eine benutzerdefinierte Quellzeichenfolge sein.
sourceType Erforderliches Enumerationsattribut.

Der Quelltyp für die Daten, die einem benutzerdefinierten Feld im Protokoll hinzugefügt werden sollen. Kann RequestHeader (Wert = 0), ResponseHeader (Wert = 1) oder ServerVariable (Wert = 2) sein.

Untergeordnete Elemente

Keine.

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="4095">
                <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 Commitparameter auf apphost 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'}