共用方式為


ODBC 記錄 < odbcLogging>

概觀

元素 <odbcLogging> 會為 Internet Information Services (IIS) 7 設定 Open Database Connectivity (ODBC) 記錄。 ODBC 記錄會將所有 HTTP 活動記錄到使用者定義的資料庫,而不是記錄到文字檔。

ODBC 記錄會在 IIS 7 中實作為自訂記錄模組,因此在 IIS 7 中啟用和設定 ODBC 記錄包含兩個不同的動作:

  • 在 專案中設定 ODBC 記錄屬性 <odbcLogging> 。 具體而言,必須設定下列屬性:

    • dataSource屬性必須針對tableName屬性所指定資料表所在的資料庫指定系統資料來源名稱 (DSN) 。
    • 密碼屬性必須指定 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 在 IIS 8.0 中未修改專案 <odbcLogging>
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) ]、[ 網頁伺服器]、[ 健康情況和診斷],然後選取 [ODBC 記錄]。 按一下 [下一步] 。
    此螢幕擷取畫面顯示已選取 O D B C 記錄的 Windows Server 2012 或 Windows Server 2012 R2 的健全狀況和診斷功能。 .
  5. 在 [選取功能] 頁面上,按 [下一步]
  6. 在 [確認安裝選項] 頁面上,按一下 [安裝]
  7. 在 [結果] 頁面上,按一下 [關閉]

Windows 8 或Windows 8.1

  1. 在 [開始] 畫面上,將指標全部移至左下角,以滑鼠右鍵按一下 [開始] 按鈕,然後按一下[主控台]。
  2. 主控台中,按一下 [程式和功能],然後按一下 [開啟或關閉 Windows 功能]。
  3. 序展開 [Internet Information Services]、[ 萬維網服務]、[ 健康情況和診斷],然後選取 [ODBC 記錄]。
    此螢幕擷取畫面顯示已選取 O D B C 記錄的 Windows 8 或Windows 8.1健康情況和診斷功能。
  4. 按一下 [確定]。
  5. 按一下 [關閉] 。

Windows Server 2008 或 Windows Server 2008 R2

  1. 在工作列上,按一下 [開始],指向 [系統管理工具],然後按一下[伺服器管理員]。
  2. [伺服器管理員階層] 窗格中,展開 [角色],然後按一下 [Web 服務器] (IIS)
  3. [Web 服務器 (IIS) ] 窗格中,捲動至 [ 角色服務 ] 區段,然後按一下 [ 新增角色服務]。
  4. 在 [新增角色服務精靈] 的 [選取角色服務] 頁面上,選取[ODBC 記錄],然後按 [下一步]。
    此螢幕擷取畫面顯示已選取 O D B C 記錄的 Windows Server 2008 或 Windows Server 2008 R2 的健全狀況和診斷功能。
  5. 在 [確認安裝選項] 頁面上,按一下 [安裝]
  6. 在 [結果] 頁面上,按一下 [關閉]

Windows Vista 或 Windows 7

  1. 在工作列上,按一下 [開始],然後按一下[主控台]。
  2. 主控台中,按一下 [程式和功能],然後按一下 [開啟或關閉 Windows 功能]。
  3. 展開 [Internet Information Services],然後選取 [ODBC 記錄],然後按一下 [ 確定]。
    此螢幕擷取畫面顯示已選取 O D B C 記錄的 Windows Vista 或 Windows 7 健康情況和診斷功能。

作法

沒有用於設定 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 來設定這些設定時,請務必將 認可 參數 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