Настраиваемые поля в файле журнала для сайта <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 и более поздних версий по умолчанию.
Инструкции
Добавление настраиваемых полей
Откройте диспетчер служб IIS.
Если вы используете Windows Server 2012 R2:
- На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
Если вы используете Windows 8.1:
- Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
- Щелкните Администрирование, а затем дважды щелкните диспетчер служб IIS.
В области Подключения разверните сервер, узел Сайты, а затем выберите сайт.
Дважды щелкните ведение журнала.
На домашней странице Ведение журнала для параметра Формат выберите W3C.
Щелкните Выбрать поля.
В диалоговом окне Поля ведения журнала W3C нажмите кнопку Добавить поле.
В диалоговом окне Добавление настраиваемого поля введите имя в поле Имя поля и выберите одно из следующих значений в поле Тип источника: Заголовок запроса, Заголовок ответа или Переменная сервера.
В поле Источник выберите источник из списка или введите имя настраиваемого источника.
Нажмите кнопку ОК, а затем еще раз нажмите кнопку ОК .
В области Действие нажмите кнопку Применить.
Настройка максимальной длины настраиваемого поля
Откройте диспетчер служб IIS.
Если вы используете Windows Server 2012 R2:
- На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
Если вы используете Windows 8.1:
- Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
- Щелкните Администрирование, а затем дважды щелкните диспетчер служб IIS.
В области Подключения выберите сервер, а затем в области Управление дважды щелкните редактор конфигурации.
В редакторе конфигураций в разделе выберите system.applicationHost, а затем — сайты.
Щелкните (Коллекция) и нажмите кнопку с многоточием.
Выберите сайт, разверните logFile, customFields и щелкните maxCustomFieldLength.
Для параметра maxCustomFieldLength введите максимальный объем данных, которые можно добавить в файл журнала в любом настраиваемом поле в байтах.
Закройте редактор коллекций, а затем в области Действие нажмите кнопку Применить.
Конфигурация
Элемент <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'}