Ведение журнала <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:
  • LogOdbcDataSource
  • LogOdbcPassword
  • LogOdbcTableName
  • LogOdbcUserName

Настройка

Элемент <odbcLogging> недоступен при установке iis 7 и более поздних версий по умолчанию. Чтобы установить его, выполните следующие действия.

Windows Server 2012 или Windows Server 2012 R2

  1. На панели задач щелкните Диспетчер сервера.
  2. В диспетчер сервера откройте меню Управление и выберите пункт Добавить роли и компоненты.
  3. В мастере добавления ролей и компонентов нажмите кнопку Далее. Выберите тип установки и нажмите кнопку Далее. Выберите целевой сервер и нажмите кнопку Далее.
  4. На странице Роли сервера разверните узел Веб-сервер (IIS),веб-сервер, затем узел Работоспособность и диагностика, а затем выберите Ведение журнала ODBC. Щелкните Далее.
    Снимок экрана: функции работоспособности и диагностики для Windows Server 2012 или Windows Server 2012 R2 с выбранным параметром ведения журнала OD B C. .
  5. На странице Выбор компонентов нажмите кнопку Далее.
  6. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
  7. На странице Результаты нажмите кнопку Закрыть.

Windows 8 или Windows 8.1

  1. На начальном экране переместите указатель в левый нижний угол, щелкните правой кнопкой мыши кнопку Пуск и выберите панель управления.
  2. В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.
  3. Разверните узлы Службы IIS, Веб-службы, Работоспособность и диагностика, а затем выберите Ведение журнала ODBC.
    Снимок экрана: функции работоспособности и диагностики для Windows 8 или Windows 8.1 с выбранным параметром ведения журнала OD B C.
  4. Нажмите кнопку ОК.
  5. Щелкните Закрыть.

Windows Server 2008 или Windows Server 2008 R2

  1. На панели задач нажмите кнопку Пуск, выберите Администрирование, а затем диспетчер сервера.
  2. В области иерархии диспетчер сервера разверните узел Роли и выберите Веб-сервер (IIS).
  3. На панели Веб-сервер (IIS) прокрутите страницу до раздела Службы ролей и щелкните Добавить службы ролей.
  4. На странице Выбор служб ролеймастера добавления служб ролей выберите Ведение журнала ODBC и нажмите кнопку Далее.
    Снимок экрана: функции работоспособности и диагностики для Windows Server 2008 или Windows Server 2008 R2 с выбранным параметром ведения журнала OD B C.
  5. На странице Подтверждение выбранных элементов для установки нажмите кнопку Установить.
  6. На странице Результаты нажмите кнопку Закрыть.

Windows Vista или Windows 7

  1. На панели задач нажмите кнопку Пуск, а затем панель управления.
  2. В панель управления выберите Программы и компоненты, а затем — Включить или отключить компоненты Windows.
  3. Разверните узел Службы IIS, выберите Ведение журнала ODBC и нажмите кнопку ОК.
    Снимок экрана: функции работоспособности и диагностики для Windows Vista или Windows 7 с выбранным параметром ведения журнала OD B C.

Инструкции

Отсутствует пользовательский интерфейс для настройки ведения журнала 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