Ведение журнала <ODBC odbcLogging>
Общие сведения
Элемент <odbcLogging>
настраивает ведение журнала OPEN Database Connectivity (ODBC) для служб IIS 7. Ведение журнала ODBC записывает все действия HTTP в определяемую пользователем базу данных, а не в текстовые файлы.
Ведение журнала ODBC реализовано в виде пользовательского модуля ведения журнала в IIS 7, поэтому включение и настройка ведения журнала ODBC в IIS 7 состоит из двух отдельных действий:
Задание атрибутов ведения журнала ODBC в элементе
<odbcLogging>
. В частности, необходимо настроить следующие атрибуты:- Атрибут dataSource должен указывать имя системного источника данных (DSN) для базы данных, в которой находится таблица, указанная атрибутом tableName .
- Атрибут password должен указывать пароль базы данных, который iis 7 будет использовать при записи данных журнала в базу данных.
- Атрибут tableName должен указывать имя таблицы базы данных в базе данных, указанное атрибутом dataSource .
- Атрибут userName должен указывать имя пользователя базы данных, которое iis 7 будет использовать при записи данных журнала в базу данных.
Задание правильных настраиваемых атрибутов ведения журнала в элементе <logFile> . В частности, необходимо настроить следующие атрибуты:
- Атрибуту logFormat необходимо задать значение "Custom".
- Атрибут customLogPluginClsid должен иметь значение "{FF16065B-DE82-11CF-BC0A-00AA00611E0}".
По умолчанию IIS 7 записывает все действия в текстовые файлы, использующие расширенный формат файла журнала W3C, и по умолчанию можно настроить IIS для использования других форматов текстовых файлов, таких как NCSA или собственный формат IIS. Основной недостаток использования этих текстовых форматов заключается в том, что их труднее проанализировать для действий и, как правило, требуется служебная программа , например LogParser корпорации Майкрософт , для получения любой полезной информации из журналов. Кроме того, производительность анализа данных с текстовыми файлами также обычно гораздо медленнее, чем при использовании базы данных. Однако текстовое ведение журнала выполняется в режиме ядра, что повышает производительность запросов на ведение журнала.
При использовании ведения журнала ODBC действия сервера хранятся в базе данных, что должно значительно улучшить получение данных. Это расширяет возможности использования широкого спектра клиентов баз данных при интеллектуальном анализе данных на сервере. Основным недостатком использования ведения журнала ODBC является производительность ведения журнала, так как при включении ведения журнала ODBC службы IIS отключают кэш в режиме ядра. По этой причине реализация ведения журнала ODBC может снизить общую производительность сервера.
Примечание
Чтобы создать таблицу для ведения журнала ODBC, можно использовать файл "%windir%\System32\inetsrv\logtemp.sql", который предоставляется вместе с IIS 7. Дополнительные сведения о ведении журнала ODBC см. в статье базы знаний Майкрософт 245243.
Совместимость
Версия | Примечания |
---|---|
IIS 10.0 | Элемент <odbcLogging> не был изменен в IIS 10.0. |
IIS 8,5 | Элемент <odbcLogging> не был изменен в IIS 8.5. |
IIS 8,0 | Элемент <odbcLogging> не был изменен в IIS 8.0. |
IIS 7,5 | Элемент <odbcLogging> не был изменен в IIS 7.5. |
IIS 7.0 | Элемент <odbcLogging> появился в IIS 7.0. |
IIS 6,0 | Атрибуты <odbcLogging> элемента заменяют следующие свойства метабазы IIS 6.0:
|
Настройка
Элемент <odbcLogging>
недоступен при установке iis 7 и более поздних версий по умолчанию. Чтобы установить его, выполните следующие действия.
Windows Server 2012 или Windows Server 2012 R2
- На панели задач щелкните Диспетчер сервера.
- В диспетчер сервера откройте меню Управление и выберите пункт Добавить роли и компоненты.
- В мастере добавления ролей и компонентов нажмите кнопку Далее. Выберите тип установки и нажмите кнопку Далее. Выберите целевой сервер и нажмите кнопку Далее.
- На странице Роли сервера разверните узел Веб-сервер (IIS),веб-сервер, затем узел Работоспособность и диагностика, а затем выберите Ведение журнала ODBC. Щелкните Далее.
. - На странице Выбор компонентов нажмите кнопку Далее.
- На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
- На странице Результаты нажмите кнопку Закрыть.
Windows 8 или Windows 8.1
- На начальном экране переместите указатель в левый нижний угол, щелкните правой кнопкой мыши кнопку Пуск и выберите панель управления.
- В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.
- Разверните узлы Службы IIS, Веб-службы, Работоспособность и диагностика, а затем выберите Ведение журнала ODBC.
- Нажмите кнопку ОК.
- Щелкните Закрыть.
Windows Server 2008 или Windows Server 2008 R2
- На панели задач нажмите кнопку Пуск, выберите Администрирование, а затем диспетчер сервера.
- В области иерархии диспетчер сервера разверните узел Роли и выберите Веб-сервер (IIS).
- На панели Веб-сервер (IIS) прокрутите страницу до раздела Службы ролей и щелкните Добавить службы ролей.
- На странице Выбор служб ролеймастера добавления служб ролей выберите Ведение журнала ODBC и нажмите кнопку Далее.
- На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
- На странице Результаты нажмите кнопку Закрыть.
Windows Vista или Windows 7
- На панели задач нажмите кнопку Пуск, а затем панель управления.
- В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.
- Разверните узел Службы IIS, выберите Ведение журнала ODBC и нажмите кнопку ОК.
Инструкции
Отсутствует пользовательский интерфейс для настройки ведения журнала ODBC для IIS 7. Примеры настройки ведения журнала ODBC программным способом см. в разделе Примеры кода этого документа.
Конфигурация
Атрибуты
Атрибут | Описание |
---|---|
dataSource |
Необязательный строковый атрибут. Задает имя системного источника данных (DSN) для базы данных, в которую записывается журнал. Значение по умолчанию — InternetDb . |
password |
Необязательный строковый атрибут. Указывает пароль базы данных ODBC, который используется при записи сведений в базу данных во время ведения журнала событий. По умолчанию это значение зашифровано. Значение по умолчанию — [enc:AesProvider::enc] . |
tableName |
Необязательный строковый атрибут. Указывает имя таблицы базы данных ODBC, в которую Windows записывает сведения во время ведения журнала событий. Значение по умолчанию — InternetLog . |
userName |
Необязательный строковый атрибут. Указывает имя пользователя базы данных ODBC, которое используется для записи сведений в базу данных во время ведения журнала событий. Значение по умолчанию — InternetAdmin . |
Дочерние элементы
Отсутствует.
Образец конфигурации
Этот первый пример конфигурации для веб-сайта по умолчанию настраивает атрибуты в <odbcLogging>
элементе , указывающие системное имя DSN, имя таблицы, имя пользователя и пароль для подключения к журналу ODBC.
<location path="Default Web Site">
<system.webServer>
<odbcLogging dataSource="InternetDb"
tableName="InternetLog"
userName="InternetAdmin"
password="[enc:AesProvider:57686f6120447564652c2049495320526f636b73:enc]" />
</system.webServer>
</location>
Этот второй пример конфигурации настраивает правильные настраиваемые атрибуты ведения журнала в <элементе logFile> , который включает ведение журнала ODBC для веб-сайта по умолчанию.
<site name="Default Web Site" id="1" serverAutoStart="true">
<application path="/" applicationPool="DefaultAppPool">
<virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:80:" />
</bindings>
<logFile logFormat="Custom"
customLogPluginClsid="{FF16065B-DE82-11CF-BC0A-00AA006111E0}" />
</site>
Пример кода
В следующих примерах кода настраивается два набора параметров для веб-сайта по умолчанию:
- В первой половине каждого примера настраиваются атрибуты в элементе
<odbcLogging>
, указывающие системное имя DSN, имя таблицы, имя пользователя и пароль для подключения к журналу ODBC. - Во второй половине каждого примера указываются настраиваемые атрибуты ведения журнала в <элементе logFile> , которые позволяют вести журнал ODBC.
AppCmd.exe
appcmd.exe set config "Default Web Site" -section:system.webServer/odbcLogging /dataSource:"InternetDb" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/odbcLogging /tableName:"InternetLog" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/odbcLogging /userName:"InternetAdmin" /commit:apphost
appcmd.exe set config "Default Web Site" -section:system.webServer/odbcLogging /password:"P@ssw0rd" /commit:apphost
appcmd.exe set sites "Default Web Site" -logFile.logFormat:"Custom" /commit:apphost
appcmd.exe set sites "Default Web Site" -logFile.customLogPluginClsid:"{FF16065B-DE82-11CF-BC0A-00AA006111E0}" /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 odbcLoggingSection = config.GetSection("system.webServer/odbcLogging", "Default Web Site");
odbcLoggingSection["dataSource"] = @"InternetDb";
odbcLoggingSection["tableName"] = @"InternetLog";
odbcLoggingSection["userName"] = @"InternetAdmin";
odbcLoggingSection["password"] = @"P@ssw0rd";
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Default Web Site");
if (siteElement == null) throw new InvalidOperationException("Element not found!");
ConfigurationElement logFileElement = siteElement.GetChildElement("logFile");
logFileElement["customLogPluginClsid"] = @"{FF16065B-DE82-11CF-BC0A-00AA006111E0}";
logFileElement["logFormat"] = @"Custom";
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 odbcLoggingSection As ConfigurationSection = config.GetSection("system.webServer/odbcLogging", "Default Web Site")
odbcLoggingSection("dataSource") = "InternetDb"
odbcLoggingSection("tableName") = "InternetLog"
odbcLoggingSection("userName") = "InternetAdmin"
odbcLoggingSection("password") = "P@ssw0rd"
Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Default Web Site")
If (siteElement Is Nothing) Then
Throw New InvalidOperationException("Element not found!")
End If
Dim logFileElement As ConfigurationElement = siteElement.GetChildElement("logFile")
logFileElement("customLogPluginClsid") = "{FF16065B-DE82-11CF-BC0A-00AA006111E0}"
logFileElement("logFormat") = "Custom"
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 odbcLoggingSection = adminManager.GetAdminSection("system.webServer/odbcLogging", "MACHINE/WEBROOT/APPHOST/Default Web Site");
odbcLoggingSection.Properties.Item("dataSource").Value = "InternetDb";
odbcLoggingSection.Properties.Item("tableName").Value = "InternetLog";
odbcLoggingSection.Properties.Item("userName").Value = "InternetAdmin";
odbcLoggingSection.Properties.Item("password").Value = "P@ssw0rd";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Default Web Site"]);
if (siteElementPos == -1) throw "Element not found!";
var siteElement = sitesCollection.Item(siteElementPos);
var logFileElement = siteElement.ChildElements.Item("logFile");
logFileElement.Properties.Item("customLogPluginClsid").Value = "{FF16065B-DE82-11CF-BC0A-00AA006111E0}";
logFileElement.Properties.Item("logFormat").Value = "Custom";
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 = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set odbcLoggingSection = adminManager.GetAdminSection("system.webServer/odbcLogging", "MACHINE/WEBROOT/APPHOST/Default Web Site")
odbcLoggingSection.Properties.Item("dataSource").Value = "InternetDb"
odbcLoggingSection.Properties.Item("tableName").Value = "InternetLog"
odbcLoggingSection.Properties.Item("userName").Value = "InternetAdmin"
odbcLoggingSection.Properties.Item("password").Value = "P@ssw0rd"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Default Web Site"))
If (siteElementPos = -1) Then
WScript.Echo "Element not found!"
WScript.Quit
End If
Set siteElement = sitesCollection.Item(siteElementPos)
Set logFileElement = siteElement.ChildElements.Item("logFile")
logFileElement.Properties.Item("customLogPluginClsid").Value = "{FF16065B-DE82-11CF-BC0A-00AA006111E0}"
logFileElement.Properties.Item("logFormat").Value = "Custom"
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