ODBC 日志记录 <odbcLogging>

概述

<odbcLogging> 元素为 Internet Information Services (IIS) 7 配置开放式数据库连接 (ODBC) 日志记录。 ODBC 日志记录将所有 HTTP 活动记录到用户定义的数据库而不是文本文件。

ODBC 日志记录在 IIS 7 中作为自定义日志记录模块实现,因此在 IIS 7 中启用和配置 ODBC 日志记录由两个单独的操作组成:

  • <odbcLogging> 元素中设置 ODBC 日志记录属性。 具体而言,必须配置以下属性:

    • dataSource 属性必须为 tableName 属性所指定的表所在的数据库指定系统数据源名称 (DSN)。
    • password 属性必须指定 IIS 7 在向数据库写入日志信息时将使用的数据库密码。
    • tableName 属性必须在由 dataSource 属性指定的数据库中指定数据库表的名称。
    • userName 属性必须指定 IIS 7 在向数据库写入日志信息时将使用的数据库用户名。
  • <logFile> 元素中设置正确的自定义日志记录属性。 具体而言,必须配置以下属性:

    • logFormat 属性必须设置为“Custom”。
    • customLogPluginClsid 属性必须设置为“{FF16065B-DE82-11CF-BC0A-00AA006111E0}

默认情况下,IIS 7 将所有活动记录到使用 W3C 扩展日志文件格式的文本文件中,并且默认情况下,可以将 IIS 配置为使用其他文本文件格式,如 NCSA 或本机 IIS 格式。 使用这些基于文本的格式的主要缺点是,活动更难以解析,并且通常需要像 Microsoft 的 LogParser 这样的实用程序才能从日志中检索任何有用的信息。 此外,文本文件的数据解析性能通常也比使用数据库慢得多。 但是,基于文本的日志记录在内核模式下执行,因此提高了日志记录请求的性能。

使用 ODBC 日志记录时,服务器的活动存储在数据库中,这应该会极大提高数据检索性能。 这扩展了在数据挖掘服务器活动时使用各种数据库客户端的可能性。 使用 ODBC 日志记录的主要缺点是日志记录的性能,因为在启用 ODBC 日志记录时,IIS 会禁用内核模式缓存。 因此,实现 ODBC 日志记录可能会降低服务器的整体性能。

注意

要创建 ODBC 日志记录表,可以使用 IIS 7 中提供的“%windir%\System32\inetsrv\logtemp.sql”文件。 有关 ODBC 日志记录的详细信息,请参阅 Microsoft 知识库文章 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. 在“服务器角色”页上,依次展开“Web 服务器(IIS)”、“Web 服务器”和“运行状况和诊断”,然后选择“ODBC 日志记录”。 单击 “下一步”
    Screenshot shows the Health and Diagnostics features for Windows Server 2012 or Windows Server 2012 R2 with O D B C Logging selected.
  5. 在“选择功能”页上,单击“下一步”
  6. “确认安装选择”页上,单击“安装”
  7. 在“结果” 页面中单击“关闭”

Windows 8 或 Windows 8.1

  1. 在“开始”屏幕上,将指针一直移动到左下角,右键单击“开始”按钮,然后单击“控制面板”
  2. 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
  3. 依次展开“Internet Information Services”、“万维网服务”、“运行状况和诊断”,然后选择“ODBC 日志记录”
    Screenshot shows the Health and Diagnostics features for Windows 8 or Windows 8.1 with O D B C Logging selected.
  4. 单击“确定”。
  5. 单击“关闭” 。

Windows Server 2008 或 Windows Server 2008 R2

  1. 在任务栏上,单击“开始”,指向“管理工具”,然后单击“服务器管理器”。
  2. 在“服务器管理器”层次结构窗格中,展开“角色”,然后单击“Web 服务器(IIS)”。
  3. 在“Web 服务器(IIS)”窗格中,滚动到“角色服务”部分,然后单击“添加角色服务”。
  4. 在“添加角色服务向导”的“选择角色服务”页上,选择“ODBC 日志记录”,然后单击“下一步”。
    Screenshot shows the Health and Diagnostics features for Windows Server 2008 or Windows Server 2008 R2 with O D B C Logging selected.
  5. “确认安装选择”页中,单击“安装”
  6. 在“结果” 页面中单击“关闭”

Windows Vista 或 Windows 7

  1. 在任务栏上,单击“开始”,然后单击“控制面板”。
  2. 在“控制面板”中,单击“程序与功能”,然后单击“打开或关闭 Windows 功能”。
  3. 展开“Internet Information Services”,选择“ODBC 日志记录”,然后单击“确定”。
    Screenshot shows the Health and Diagnostics features for Windows Vista or Windows 7 with O D B C Logging selected.

操作方式

IIS 7 中没有用于配置 ODBC 日志记录的用户界面。 若要通过示例来了解如何以编程方式配置 ODBC 日志记录,请参阅本文档的代码示例部分。

配置

特性

属性 说明
dataSource 可选的字符串属性。 指定写入日志的数据库的系统数据源名称 (DSN)。

默认值为 InternetDb
password 可选的字符串属性。 指定在事件日志记录期间将信息写入数据库时使用的 ODBC 数据库密码。 默认情况下,此值已加密。

默认值为 [enc:AesProvider::enc]
tableName 可选的字符串属性。 指定 ODBC 数据库表的名称,其中 Windows 在事件日志记录期间写入信息。

默认值为 InternetLog
userName 可选的字符串属性。 指定用于在事件日志记录期间将信息写入数据库的 ODBC 数据库用户名。

默认值为 InternetAdmin

子元素

无。

配置示例

默认网站的第一个配置示例配置 <odbcLogging> 元素中的属性,这些属性为 ODBC 日志记录连接指定系统 DSN、表名、用户名和密码。

<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> 元素中的属性,这些属性为 ODBC 日志记录连接指定系统 DSN、表名、用户名和密码。
  • 每个示例的后半部分在 <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 配置这些设置时,必须确保将 commit 参数设置为 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