ODBC Logging <odbcLogging>

Panoramica

L'elemento <odbcLogging> configura la registrazione ODBC (Open Database Connectivity) per Internet Information Services (IIS) 7. La registrazione ODBC registra tutte le attività HTTP in un database definito dall'utente anziché in file di testo.

La registrazione ODBC viene implementata come modulo di registrazione personalizzato in IIS 7, pertanto l'abilitazione e la configurazione della registrazione ODBC in IIS 7 sono costituite da due azioni separate:

  • Impostazione degli attributi di registrazione ODBC nell'elemento <odbcLogging> . In particolare, è necessario configurare gli attributi seguenti:

    • L'attributo dataSource deve specificare il nome dell'origine dati di sistema (DSN) per il database in cui si trova la tabella specificata dall'attributo tableName .
    • L'attributo password deve specificare la password del database che IIS 7 userà durante la scrittura delle informazioni di log nel database.
    • L'attributo tableName deve specificare il nome della tabella di database nel database specificato dall'attributo dataSource .
    • L'attributo userName deve specificare il nome utente del database che IIS 7 userà durante la scrittura delle informazioni di log nel database.
  • Impostazione degli attributi di registrazione personalizzati corretti nell'elemento <logFile> . In particolare, è necessario configurare gli attributi seguenti:

    • L'attributo logFormat deve essere impostato su "Custom".
    • L'attributo customLogPluginClsid deve essere impostato su "{FF16065B-DE82-11CF-BC0A-00AA006111E0}"

Per impostazione predefinita, IIS 7 registra tutte le attività nei file di testo che usano il formato di file di log esteso W3C e per impostazione predefinita è possibile configurare IIS per l'uso di altri formati di file di testo, ad esempio NCSA o il formato IIS nativo. Lo svantaggio principale dell'uso di questi formati basati su testo è che sono più difficili da analizzare per l'attività e in genere richiedono un'utilità come LogParser di Microsoft per recuperare eventuali informazioni utili dai log. Inoltre, le prestazioni di analisi dei dati con i file di testo sono in genere molto più lente rispetto all'uso di un database. Tuttavia, la registrazione basata su testo viene eseguita in modalità kernel, che migliora le prestazioni per la registrazione delle richieste.

Quando si usa la registrazione ODBC, l'attività del server viene archiviata in un database, che dovrebbe migliorare notevolmente il recupero dei dati. In questo modo si espande la possibilità di usare un'ampia gamma di client di database durante l'attività del server di data mining. Lo svantaggio principale dell'uso della registrazione ODBC è rappresentato dalle prestazioni per la registrazione perché quando la registrazione ODBC è abilitata, IIS disabilita la cache in modalità kernel. Per questo motivo, l'implementazione della registrazione ODBC può ridurre le prestazioni complessive del server.

Nota

Per creare la tabella per la registrazione ODBC, è possibile usare il file "%windir%\System32\inetsrv\logtemp.sql" fornito con IIS 7. Per altre informazioni sulla registrazione ODBC, vedere l'articolo della Microsoft Knowledge Base 245243.

Compatibilità

Versione Note
IIS 10.0 L'elemento <odbcLogging> non è stato modificato in IIS 10.0.
IIS 8,5 L'elemento <odbcLogging> non è stato modificato in IIS 8.5.
IIS 8,0 L'elemento <odbcLogging> non è stato modificato in IIS 8.0.
IIS 7,5 L'elemento <odbcLogging> non è stato modificato in IIS 7.5.
IIS 7.0 L'elemento <odbcLogging> è stato introdotto in IIS 7.0.
IIS 6.0 Gli attributi dell'elemento <odbcLogging> sostituiscono le proprietà della metabase IIS 6.0 seguenti:
  • LogOdbcDataSource
  • LogOdbcPassword
  • LogOdbcTableName
  • LogOdbcUserName

Installazione

L'elemento <odbcLogging> non è disponibile nell'installazione predefinita di IIS 7 e versioni successive. Per installarlo, seguire questa procedura.

Windows Server 2012 o Windows Server 2012 R2

  1. Sulla barra delle applicazioni fare clic su Server Manager.
  2. In Server Manager fare clic sul menu Gestisci e quindi su Aggiungi ruoli e funzionalità.
  3. Nella procedura guidata Aggiungi ruoli e funzionalità fare clic su Avanti. Selezionare il tipo di installazione e fare clic su Avanti. Selezionare il server di destinazione e fare clic su Avanti.
  4. Nella pagina Ruoli server espandere Server Web (IIS), server Web, server Web, integrità e diagnostica e quindi selezionare Registrazione ODBC. Fare clic su Avanti.
    Screenshot che mostra le funzionalità di integrità e diagnostica per Windows Server 2012 o Windows Server 2012 R2 con registrazione O D B C selezionata. .
  5. Nella pagina Selezione funzionalità fare clic su Avanti.
  6. Nella pagina Conferma selezioni per l'installazione fare clic su Installa.
  7. Nella pagina Risultati fare clic su Chiudi.

Windows 8 o Windows 8.1

  1. Nella schermata Start spostare il puntatore fino all'angolo inferiore sinistro, fare clic con il pulsante destro del mouse sul pulsante Start e quindi scegliere Pannello di controllo.
  2. In Pannello di controllo fare clic su Programmi e funzionalità e quindi su Attiva o disattiva funzionalità di Windows.
  3. Espandere Internet Information Services, servizi Web a livello globale, integrità e diagnostica, quindi selezionare Registrazione ODBC.
    Screenshot che mostra le funzionalità di integrità e diagnostica per Windows 8 o Windows 8.1 con registrazione O D B C selezionata.
  4. Fare clic su OK.
  5. Fare clic su Close.

Windows Server 2008 o Windows Server 2008 R2

  1. Sulla barra delle applicazioni fare clic su Start, scegliere Strumenti di amministrazione, quindi fare clic su Server Manager.
  2. Nel riquadro della gerarchia Server Manager espandere Ruoli, quindi fare clic su Server Web (IIS).
  3. Nel riquadro Server Web (IIS) scorrere fino alla sezione Servizi ruolo e quindi fare clic su Aggiungi servizi ruolo.
  4. Nella pagina Selezione servizi ruolo della Procedura guidata Aggiungi servizi ruolo selezionare Registrazione ODBC e quindi fare clic su Avanti.
    Screenshot che mostra le funzionalità di integrità e diagnostica per Windows Server 2008 o Windows Server 2008 R2 con registrazione O D B C selezionata.
  5. Nella pagina Conferma selezioni per l'installazione fare clic su Installa.
  6. Nella pagina Risultati fare clic su Chiudi.

Windows Vista o Windows 7

  1. Sulla barra delle applicazioni fare clic su Start e quindi su Pannello di controllo.
  2. In Pannello di controllo fare clic su Programmi e funzionalità e quindi su Attiva o disattiva funzionalità di Windows.
  3. Espandere Internet Information Services, quindi selezionare Registrazione ODBC, quindi fare clic su OK.
    Screenshot che mostra le funzionalità di integrità e diagnostica per Windows Vista o Windows 7 con registrazione O D B C selezionata.

Procedure

Non è disponibile alcuna interfaccia utente per la configurazione della registrazione ODBC per IIS 7. Per esempi di come configurare la registrazione ODBC a livello di codice, vedere la sezione Esempi di codice di questo documento.

Configurazione

Attributi

Attributo Descrizione
dataSource Attributo stringa facoltativo. Specifica il nome dell'origine dati di sistema (DSN) per il database in cui viene scritto il log.

Il valore predefinito è InternetDb.
password Attributo stringa facoltativo. Specifica la password del database ODBC utilizzata quando si scrivono informazioni nel database durante la registrazione degli eventi. Per impostazione predefinita, questo valore è crittografato.

Il valore predefinito è [enc:AesProvider::enc].
tableName Attributo stringa facoltativo. Specifica il nome della tabella di database ODBC in cui Windows scrive informazioni durante la registrazione degli eventi.

Il valore predefinito è InternetLog.
userName Attributo stringa facoltativo. Specifica il nome utente del database ODBC usato per la scrittura di informazioni nel database durante la registrazione eventi.

Il valore predefinito è InternetAdmin.

Elementi figlio

Nessuno.

Esempio di configurazione

Questo primo esempio di configurazione per il sito Web predefinito configura gli attributi nell'elemento <odbcLogging> che specificano il DSN di sistema, il nome della tabella, il nome utente e la password per una connessione di registrazione ODBC.

<location path="Default Web Site">
   <system.webServer>
      <odbcLogging dataSource="InternetDb"
         tableName="InternetLog"
         userName="InternetAdmin"
         password="[enc:AesProvider:57686f6120447564652c2049495320526f636b73:enc]" />
   </system.webServer>
</location>

Questo secondo esempio di configurazione configura gli attributi di registrazione personalizzati corretti nell'elemento <logFile> che abilitano la registrazione ODBC per il sito Web predefinito.

<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>

Codice di esempio

Gli esempi di codice seguenti configurano due set di opzioni per il sito Web predefinito:

  • La prima metà di ogni esempio configura gli attributi nell'elemento <odbcLogging> che specificano il DSN di sistema, il nome della tabella, il nome utente e la password per una connessione di registrazione ODBC.
  • La seconda metà di ogni esempio specifica gli attributi di registrazione personalizzati nell'elemento <logFile> che abilitano la registrazione 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

Nota

È necessario assicurarsi di impostare il parametro commit su apphost quando si usa AppCmd.exe per configurare queste impostazioni. Questa operazione esegue il commit delle impostazioni di configurazione nella sezione percorso appropriata nel file di 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