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
Ö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.
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 Feldnamen ein, und wählen Sie einen der folgenden Optionen für den Quelltyp aus: 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 zuerst 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:
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.
Wählen Sie im Bereich Verbindungen den Server aus, und doppelklicken Sie dann im Verwaltungsbereich auf Konfigurations-Editor.
Wählen Sie im Konfigurations-Editor für den Abschnittsystem.applicationHost und dann Sites aus.
Klicken Sie auf (Auflistung) 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 ein, die einer Protokolldatei in einem benutzerdefinierten Feld in Byte hinzugefügt werden kann.
Schließen Sie den Auflistungs-Editor, und klicken Sie dann im Aktionsbereich auf Anwenden.
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'}