Condividi tramite


Campi personalizzati in un file di log per un sito <personalizzatoCampi>

Panoramica

L'elemento <customFields> dell'elemento <logFile> specifica le impostazioni di configurazione per una raccolta di campi personalizzati in un log W3C.

IIS 8.5 consente di registrare campi personalizzati oltre al set registrato standard. Questi campi personalizzati possono includere dati da intestazioni di richiesta, intestazioni di risposta o variabili del server. Per registrare questi campi, è sufficiente impostare le proprietà di configurazione anziché creare un modulo di registrazione personalizzato. Questa funzionalità è disponibile solo a livello di sito. Il formato del file di log deve essere W3C per aggiungere campi personalizzati.

Quando un campo personalizzato è stato aggiunto al set standard, "_x" verrà aggiunto al nome del file per indicare che il file di log contiene un campo personalizzato. La quantità totale di dati aggiunti nei campi personalizzati non può superare i 65.536 byte. IIS tronca i dati se i dati registrati personalizzati superano tale quantità. La quantità massima di dati che è possibile aggiungere a un file di log in un campo personalizzato viene specificata dall'attributo maxCustomFieldLength.

Per configurare un campo personalizzato, specificare il nome del campo, il nome dell'origine e il tipo di origine. È possibile inserire informazioni personalizzate in una variabile server e registrare la variabile del server. Dopo aver selezionato il tipo di origine, è possibile selezionare un nome di origine esistente o immettere un nuovo nome di origine.

I campi personalizzati consentono di raccogliere dati utili sul processo e aggregarli ai log IIS. In un sistema contenente un servizio di bilanciamento del carico è possibile visualizzare l'indirizzo IP del servizio di bilanciamento del carico nel log, ma è possibile registrare l'intestazione X-Forwarded-For in un campo personalizzato, in modo da poter conoscere il richiedente originale. È possibile registrare il tempo di attività del processo per visualizzare il numero di volte in cui il processo è stato riavviato durante il giorno. Se la memoria inizia a essere usata in modo eccessivo, è possibile determinare in quale momento ha iniziato a utilizzare la memoria, quale pagina è stata richiesta e qual era l'ID del client (che sarebbe particolarmente utile se stesse eseguendo un'operazione dannosa).

Compatibilità

Versione Note
IIS 10.0 L'elemento <customFields> non è stato modificato in IIS 10.0.
IIS 8,5 L'elemento <customFields> è stato introdotto in IIS 8.5.
IIS 8,0 N/D
IIS 7,5 N/D
IIS 7.0 N/D
IIS 6.0 N/D

Installazione

L'elemento <customFields> è incluso nell'installazione predefinita di IIS 8.5 e versioni successive.

Procedure

Come aggiungere campi personalizzati

  1. Aprire Gestione Internet Information Services (IIS):

    • Se si usa Windows Server 2012 R2:

      • Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows 8.1:

      • Tenere premuto il tasto Windows, premere la lettera X e quindi fare clic su Pannello di controllo.
      • Fare clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
  2. Nel riquadro Connessioni espandere il server, espandere Siti e quindi selezionare un sito.

  3. Fare doppio clic su Registrazione.

  4. Nella home page Registrazione selezionare W3C per Formato.

  5. Fare clic su Seleziona campi.

  6. Nella finestra di dialogo Campi registrazione W3C fare clic su Aggiungi campo.

  7. Nella finestra di dialogo Aggiungi campo personalizzato immettere un nome in Nome campo e selezionare una delle opzioni seguenti per Tipo di origine: Intestazione richiesta, Intestazione risposta o Variabile server.

  8. In Origine selezionare un'origine dall'elenco o immettere il nome di un'origine personalizzata.

  9. Fare clic su OK, quindi fare di nuovo clic su OK .

  10. Nel riquadro Azione fare clic su Applica.

    Screenshot della finestra di dialogo Aggiungi campo personalizzato.

Come configurare la lunghezza massima del campo personalizzato

  1. Aprire Gestione Internet Information Services (IIS):

    • Se si usa Windows Server 2012 R2:

      • Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows 8.1:

      • Tenere premuto il tasto Windows, premere la lettera X e quindi fare clic su Pannello di controllo.
      • Fare clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
  2. Nel riquadro Connessioni selezionare il server e quindi nell'area Gestione fare doppio clic su Editor di configurazione.

  3. Nell'Editor di configurazione, per la sezione selezionare system.applicationHost e quindi selezionare siti.

  4. Fare clic su (Raccolta) e quindi sui puntini di sospensione.

  5. Selezionare il sito, espandere logFile, espandere customFields e quindi fare clic su maxCustomFieldLength.

  6. Per maxCustomFieldLength, immettere la quantità massima di dati che è possibile aggiungere a un file di log in un campo personalizzato, in byte.

  7. Chiudere l'Editor raccolta e quindi nel riquadro Azione fare clic su Applica.

    Screenshot del riquadro Proprietà che mostra le selezioni di menu espanse per logFile e customFields.

Configurazione

L'elemento <customFields> è configurato a livello di sito.

Attributi

Attributo Descrizione
maxCustomFieldLength Attributo uint facoltativo.

Quantità massima di dati, in byte, che può essere aggiunta a un file di log in un campo personalizzato.

L'intervallo è compreso tra 2 e 65.536. Il valore predefinito è 4096.

Elementi figlio

Elemento Descrizione
add Elemento facoltativo.

Specifica le impostazioni di configurazione per un campo personalizzato aggiunto a un log W3C.

Esempio di configurazione

Nell'esempio di configurazione seguente viene utilizzato l'elemento e il customFields relativo add elemento figlio per specificare le impostazioni del campo personalizzato del log per il sito Web predefinito.

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

Codice di esempio

Gli esempi seguenti configurano campi personalizzati per un log W3C per un sito.

AppCmd.exe

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

Nota

È necessario assicurarsi di impostare il parametro commit su apphost quando si usa AppCmd.exe per configurare queste impostazioni. In questo modo le impostazioni di configurazione vengono confermate nella sezione relativa al percorso appropriato nel file 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'}