Добавление настраиваемых полей в файл журнала для добавления сайта <>
Общие сведения
Элемент <add>
в элементе <customField>
управляет параметрами конфигурации настраиваемого поля для журнала W3C для сайта.
IIS 8.5 позволяет регистрировать настраиваемые поля в дополнение к стандартному набору записей. Эти настраиваемые поля могут включать данные из заголовков запросов, заголовков ответов или переменных сервера. Чтобы регистрировать эти поля, можно просто задать свойства конфигурации, а не создавать пользовательский модуль ведения журнала. Эта функция доступна только на уровне сайта. Чтобы добавить настраиваемые поля, файл журнала должен иметь формат W3C.
При добавлении настраиваемого поля в стандартный набор к имени файла добавляется "_x", чтобы показать, что файл журнала содержит настраиваемое поле. Общий объем данных, добавленных в настраиваемые поля, не может превышать 65 536 байт. СЛУЖБЫ IIS усекает данные, если пользовательские зарегистрированные данные превышают этот объем. Максимальный объем данных, которые можно добавить в файл журнала в любом настраиваемом поле, определяется атрибутом maxCustomFieldLength.
Чтобы настроить настраиваемое поле, укажите имя поля, имя источника и тип источника. Вы можете поместить пользовательские сведения в переменную сервера и записать ее в журнал. Выбрав тип источника, можно выбрать существующее имя источника или ввести новое имя источника.
Настраиваемые поля позволяют собирать полезные данные о процессе и агрегировать их в журналах IIS. В системе, содержащей подсистему балансировки нагрузки, ip-адрес подсистемы балансировки нагрузки может отображаться в журнале, но заголовок X-Forwarded-For можно записать в настраиваемое поле, чтобы узнать исходного инициатора запроса. Вы можете записать время безотказной работы процесса, чтобы узнать, сколько раз процесс перезапускается в течение дня. Если память начинает использоваться чрезмерно, можно определить, в какое время она начала потреблять память, какая страница была запрошена и какой идентификатор клиента (что было бы особенно полезно, если он выполнял что-то вредоносное).
Совместимость
Версия | Примечания |
---|---|
IIS 10.0 | Элемент <add> не был изменен в IIS 10.0. |
IIS 8,5 | Элемент <add> появился в IIS 8.5. |
IIS 8,0 | Н/Д |
IIS 7,5 | Н/Д |
IIS 7.0 | Н/Д |
IIS 6,0 | Н/Д |
Настройка
Элемент <add>
включен в установку 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 введите максимальный объем данных, которые можно добавить в файл журнала в любом настраиваемом поле в байтах.
Закройте редактор коллекций, а затем в области Действие нажмите кнопку Применить.
Конфигурация
Элемент <add>
настраивается на уровне сайта.
Атрибуты
Атрибут | Описание |
---|---|
logFieldName |
Обязательный строковый атрибут. Указывает настраиваемое поле, добавляемое в файл журнала. Имя поля не может содержать пробелы. |
sourceName |
Обязательный строковый атрибут. Указывает имя заголовка HTTP или серверной переменной, содержащей значения, добавляемые в настраиваемое поле журнала. Имя может быть пользовательской исходной строкой. |
sourceType |
Обязательный атрибут перечисления. Тип источника данных, добавляемых в настраиваемое поле в журнале. Может быть RequestHeader (значение = 0), ResponseHeader (значение = 1) или ServerVariable (значение = 2). |
Дочерние элементы
Отсутствует.
Образец конфигурации
В следующем примере конфигурации элемент и его add
дочерний элемент используются customFields
для указания параметров настраиваемого поля журнала для веб-сайта по умолчанию.
<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>
Пример кода
В следующих примерах настраивается настройка настраиваемых полей для журнала 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'}