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
Ö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.
Erweitern Sie im BereichVerbindungen den Server, erweitern Sie Websites, und wählen Sie dann eine Website aus.
Doppelklicken Sie auf Protokollierung.
Wählen Sie auf der Startseite Protokollierung für Format die Option W3C aus.
Klicken Sie auf Felder auswählen.
Klicken Sie im Dialogfeld W3C-Protokollierungsfelder auf Feld hinzufügen.
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.
Wählen Sie in Quelle eine Quelle aus der Liste aus, oder geben Sie den Namen einer benutzerdefinierten Quelle ein.
Klicken Sie auf OK und dann erneut auf OK.
Klicken Sie im Bereich Aktion auf Anwenden.
Konfigurieren der maximalen Länge des benutzerdefinierten Felds
Ö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.
Wählen Sie im Bereich Verbindungen den Server aus, und doppelklicken Sie dann im Bereich Verwaltung auf Konfigurations-Editor.
Wählen Sie im Konfigurations-Editor für den Abschnittsystem.applicationHost und dann Sites aus.
Klicken Sie auf (Sammlung) und dann auf die Auslassungspunkte.
Wählen Sie die Website aus, erweitern Sie logFile, erweitern Sie customFields, und klicken Sie dann auf maxCustomFieldLength.
Geben Sie für maxCustomFieldLength die maximale Datenmenge (in Byte) ein, die einer Protokolldatei in einem benutzerdefinierten Feld hinzugefügt werden kann.
Schließen Sie den Auflistungs-Editor, und klicken Sie dann im Aktionsbereich auf Anwenden.
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'}