Compartilhar via


Campos personalizados em um arquivo de log para um site <customFields>

Visão geral

O elemento <customFields> do elemento <logFile> especifica as configurações de uma coleção de campos personalizados em um log W3C.

Os IIS 8.5 permitem que você registre campos personalizados além do conjunto de logs padrão. Esses campos personalizados podem incluir dados de cabeçalhos de solicitação, cabeçalhos de resposta ou variáveis de servidor. Para registrar esses campos em log, você pode simplesmente definir propriedades de configuração em vez de criar um módulo de registro em log personalizado. Esse recurso só está disponível no nível do site. O formato do arquivo de log deve ser W3C para adicionar campos personalizados.

Quando um campo personalizado tiver sido adicionado ao conjunto padrão, "_x" será acrescentado ao nome do arquivo para mostrar que o arquivo de log contém um campo personalizado. A quantidade total de dados adicionados em campos personalizados não pode exceder 65.536 bytes. Os IIS truncarão os dados se os dados em log personalizados excederem esse valor. A quantidade máxima de dados que podem ser adicionados a um arquivo de log em qualquer campo personalizado é especificada pelo atributo maxCustomFieldLength.

Para configurar um campo personalizado, especifique o nome do campo, o nome de origem e o tipo de origem. Você pode colocar informações personalizadas em uma variável de servidor e registrar a variável de servidor em log. Depois de selecionar o tipo de origem, você pode selecionar um nome de origem existente ou inserir um novo.

Os campos personalizados permitem coletar dados úteis sobre o processo e agregá-los aos logs dos IIS. Em um sistema que contém um balanceador de carga, você pode ver o endereço IP do balanceador de carga no log, mas pode registrar o cabeçalho X-Forwarded-For em um campo personalizado, para que você possa identificar o solicitante original. Você pode registrar o tempo de atividade do processo para ver quantas vezes ele foi reiniciado durante o dia. Se a memória começar a ser usada excessivamente, você poderá determinar em que momento começou a consumir memória, qual página foi solicitada e qual era a ID do cliente (o que seria especialmente útil se estivessem fazendo algo mal-intencionado).

Compatibilidade

Versão Observações
IIS 10.0 O elemento <customFields> não foi modificado no IIS 10.0.
IIS 8.5 O elemento <customFields> foi introduzido no IIS 8.5.
IIS 8.0 N/D
IIS 7.5 N/D
IIS 7.0 N/D
IIS 6,0 N/D

Instalação

O elemento <customFields> está incluído na instalação padrão do IIS 8.5 e versões posteriores.

Instruções

Como adicionar campos personalizados

  1. Abra o Gerenciador dos Serviços de Informações da Internet (IIS):

    • Se você estiver usando o Windows Server 2012 R2:

      • Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows 8.1:

      • Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
      • Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
  2. No painel Conexões, expanda o servidor, expanda Sites e, em seguida, selecione um site.

  3. Clique duas vezes em Registrar em Log.

  4. Na página inicial Registrar em Log, para Formatar, selecione W3C.

  5. Clique em Selecionar Campos.

  6. Na caixa de diálogo Campos de Registro em Log do W3C, selecione Adicionar Campo.

  7. Na caixa de diálogo Adicionar Campo Personalizado, insira um nome em Nome do Campo e selecione um dos seguintes para o Tipo de Origem: Cabeçalho de Solicitação, Cabeçalho de Resposta ou Variável do Servidor.

  8. Em Origem, selecione uma origem na lista ou insira o nome de uma origem personalizada.

  9. Clique em OK e clique em OK novamente.

  10. No painel Ação, clique em Aplicar.

    Screenshot of the Add Custom Field dialog box.

Como configurar o comprimento máximo do campo personalizado

  1. Abra o Gerenciador dos Serviços de Informações da Internet (IIS):

    • Se você estiver usando o Windows Server 2012 R2:

      • Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows 8.1:

      • Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
      • Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
  2. No painel Conexões, selecione o servidor e, na área Gerenciamento, clique duas vezes no Editor de Configuração.

  3. No Editor de Configuração, para a seção, selecione system.applicationHost e selecione sites.

  4. Clique em (Coleção) e, em seguida, nas reticências.

  5. Selecione o site, expanda logFile, depois expanda customFields e clique em maxCustomFieldLength.

  6. Para maxCustomFieldLength, insira a quantidade máxima de dados que podem ser adicionados a um arquivo de log em qualquer campo personalizado, em bytes.

  7. Feche o Editor de Coleção e, no painel Ação, clique em Aplicar.

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

Configuração

O elemento <customFields> é configurado no nível do site.

Atributos

Atributo Descrição
maxCustomFieldLength Atributo uint opcional.

A quantidade máxima de dados, em bytes, que podem ser adicionados a um arquivo de log em qualquer campo personalizado.

O intervalo é de 2 a 65.536. O valor padrão é 4096.

Elementos filho

Elemento Descrição
add Elemento opcional.

Especifica as configurações de um campo personalizado adicionado a um log W3C.

Exemplo de configuração

O exemplo de configuração a seguir usa o elemento customFields e seu elemento filho add para especificar as configurações de campo personalizado de log para logs o site padrão.

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

Exemplo de código

Os exemplos a seguir configuram campos personalizados para um log W3C para um site.

AppCmd.exe

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

Observação

Defina o parâmetro commit para apphost quando usar AppCmd.exe para definir essas configurações. Isso confirma as definições de configuração para a seção de local apropriado no arquivo 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'}