Поделиться через


Настраиваемые поля в файле журнала для сайта <customFields>

Общие сведения

Элемент <customFields><logFile> элемента задает параметры конфигурации для коллекции настраиваемых полей в журнале W3C.

IIS 8.5 позволяет регистрировать настраиваемые поля в дополнение к стандартному набору записей. Эти настраиваемые поля могут включать данные из заголовков запросов, заголовков ответов или переменных сервера. Чтобы регистрировать эти поля, можно просто задать свойства конфигурации, а не создавать пользовательский модуль ведения журнала. Эта функция доступна только на уровне сайта. Для добавления настраиваемых полей файл журнала должен иметь формат W3C.

При добавлении настраиваемого поля в стандартный набор к имени файла добавляется слово "_x", чтобы показать, что файл журнала содержит настраиваемое поле. Общий объем данных, добавленных в настраиваемые поля, не может превышать 65 536 байт. СЛУЖБЫ IIS усекает данные, если пользовательские зарегистрированные данные превышают этот объем. Максимальный объем данных, которые можно добавить в файл журнала в любом настраиваемом поле, определяется атрибутом maxCustomFieldLength.

Чтобы настроить настраиваемое поле, укажите имя поля, имя источника и тип источника. Вы можете поместить пользовательские сведения в переменную сервера и занести ее в журнал. Выбрав тип источника, можно выбрать существующее имя источника или ввести новое имя источника.

Настраиваемые поля позволяют собирать полезные данные о процессе и агрегировать их в журналах IIS. В системе, содержащей подсистему балансировки нагрузки, вы можете увидеть IP-адрес подсистемы балансировки нагрузки в журнале, но заголовок X-Forwarded-For можно записать в настраиваемое поле, чтобы узнать исходного инициатора запроса. Вы можете зарегистрироваться в журнале времени доступности процесса, чтобы узнать, сколько раз процесс перезапускается в течение дня. Если память начинает использоваться чрезмерно, вы можете определить, в какое время она начала потреблять память, какая страница была запрошена и какой идентификатор клиента (что было бы особенно полезно, если бы он выполнял вредоносные действия).

Совместимость

Версия Примечания
IIS 10.0 Элемент <customFields> не был изменен в IIS 10.0.
IIS 8,5 Элемент <customFields> появился в IIS 8.5.
IIS 8,0 Н/Д
IIS 7,5 Н/Д
IIS 7.0 Н/Д
IIS 6,0 Н/Д

Настройка

Элемент <customFields> включен в установку iis 8.5 и более поздних версий по умолчанию.

Инструкции

Добавление настраиваемых полей

  1. Откройте диспетчер служб IIS.

    • Если вы используете Windows Server 2012 R2:

      • На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
    • Если вы используете Windows 8.1:

      • Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
      • Щелкните Администрирование, а затем дважды щелкните диспетчер служб IIS.
  2. В области Подключения разверните сервер, узел Сайты, а затем выберите сайт.

  3. Дважды щелкните ведение журнала.

  4. На домашней странице Ведение журнала для параметра Формат выберите W3C.

  5. Щелкните Выбрать поля.

  6. В диалоговом окне Поля ведения журнала W3C нажмите кнопку Добавить поле.

  7. В диалоговом окне Добавление настраиваемого поля введите имя в поле Имя поля и выберите одно из следующих значений в поле Тип источника: Заголовок запроса, Заголовок ответа или Переменная сервера.

  8. В поле Источник выберите источник из списка или введите имя настраиваемого источника.

  9. Нажмите кнопку ОК, а затем еще раз нажмите кнопку ОК .

  10. В области Действие нажмите кнопку Применить.

    Снимок экрана: диалоговое окно

Настройка максимальной длины настраиваемого поля

  1. Откройте диспетчер служб IIS.

    • Если вы используете Windows Server 2012 R2:

      • На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
    • Если вы используете Windows 8.1:

      • Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
      • Щелкните Администрирование, а затем дважды щелкните диспетчер служб IIS.
  2. В области Подключения выберите сервер, а затем в области Управление дважды щелкните редактор конфигурации.

  3. В редакторе конфигураций в разделе выберите system.applicationHost, а затем — сайты.

  4. Щелкните (Коллекция) и нажмите кнопку с многоточием.

  5. Выберите сайт, разверните logFile, customFields и щелкните maxCustomFieldLength.

  6. Для параметра maxCustomFieldLength введите максимальный объем данных, которые можно добавить в файл журнала в любом настраиваемом поле в байтах.

  7. Закройте редактор коллекций, а затем в области Действие нажмите кнопку Применить.

    Снимок экрана: панель

Конфигурация

Элемент <customFields> настраивается на уровне сайта.

Атрибуты

Атрибут Описание
maxCustomFieldLength Необязательный атрибут uint.

Максимальный объем данных в байтах, которые можно добавить в файл журнала в любом настраиваемом поле.

Диапазон от 2 до 65 536. Значение по умолчанию — 4096.

Дочерние элементы

Элемент Описание
add Необязательный элемент.

Задает параметры конфигурации для настраиваемого поля, добавленного в журнал W3C.

Образец конфигурации

В следующем примере конфигурации используется customFields элемент и его add дочерний элемент для указания параметров настраиваемого поля журнала для веб-сайта по умолчанию.

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

Пример кода

В следующих примерах настраивается настройка настраиваемых полей для журнала W3C для сайта.

AppCmd.exe

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

Примечание

При использовании AppCmd.exe для настройки этих параметров для параметра apphostфиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле 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'}