ODBC 로깅 <odbcLogging>

개요

요소는 <odbcLogging> IIS(인터넷 정보 서비스) 7에 대한 ODBC(Open Database Connectivity) 로깅을 구성합니다. ODBC 로깅은 텍스트 파일이 아닌 사용자 정의 데이터베이스에 모든 HTTP 작업을 기록합니다.

ODBC 로깅은 IIS 7에서 사용자 지정 로깅 모듈로 구현되므로 IIS 7에서 ODBC 로깅을 사용하도록 설정하고 구성하는 작업은 두 가지 개별 작업으로 구성됩니다.

  • 요소에서 ODBC 로깅 특성 <odbcLogging> 설정 특히 다음 특성을 구성해야 합니다.

    • dataSource 특성은 tableName 특성으로 지정된 테이블이 있는 데이터베이스의 DSN(시스템 데이터 원본 이름)을 지정해야 합니다.
    • 암호 특성은 로그 정보를 데이터베이스에 쓸 때 IIS 7에서 사용할 데이터베이스 암호를 지정해야 합니다.
    • tableName 특성은 dataSource 특성으로 지정된 데이터베이스의 데이터베이스 테이블 이름을 지정해야 합니다.
    • userName 특성은 로그 정보를 데이터베이스에 쓸 때 IIS 7에서 사용할 데이터베이스 사용자 이름을 지정해야 합니다.
  • logFile> 요소에서< 올바른 사용자 지정 로깅 특성을 설정합니다. 특히 다음 특성을 구성해야 합니다.

    • logFormat 특성은 "사용자 지정"으로 설정해야 합니다.
    • customLogPluginClsid 특성은 "{FF16065B-DE82-11CF-BC0A-00AA006111E0}"로 설정해야 합니다.

기본적으로 IIS 7은 W3C 확장 로그 파일 형식을 사용하는 텍스트 파일에 모든 작업을 로그하고, 기본적으로 NCSA 또는 네이티브 IIS 형식과 같은 다른 텍스트 파일 형식을 사용하도록 IIS를 구성할 수 있습니다. 이러한 텍스트 기반 형식을 사용하는 경우의 주요 단점은 활동을 구문 분석하기가 더 어렵고 일반적으로 로그에서 유용한 정보를 검색하기 위해 Microsoft의 LogParser 와 같은 유틸리티가 필요하다는 것입니다. 또한 텍스트 파일을 사용한 데이터 구문 분석 성능도 일반적으로 데이터베이스를 사용하는 것보다 훨씬 느립니다. 그러나 텍스트 기반 로깅은 커널 모드에서 수행되므로 로깅 요청의 성능이 향상됩니다.

ODBC 로깅을 사용하는 경우 서버의 활동이 데이터베이스에 저장되므로 데이터 검색이 크게 향상됩니다. 이렇게 하면 서버의 작업을 데이터 마이닝할 때 다양한 데이터베이스 클라이언트를 사용할 가능성이 확장됩니다. ODBC 로깅을 사용할 때 IIS는 커널 모드 캐시를 사용하지 않도록 설정하므로 ODBC 로깅을 사용하는 경우의 주요 단점은 로깅 성능입니다. 이러한 이유로 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. 서버 역할 페이지에서 웹 서버(IIS)를 확장하고, 웹 서버를 확장하고, 상태 및 진단을 확장한 다음, ODBC 로깅을 선택합니다. 다음을 클릭합니다.
    스크린샷은 OD B C 로깅이 선택된 Windows Server 2012 또는 Windows Server 2012 R2에 대한 상태 및 진단 기능을 보여줍니다. .
  5. 기능 선택 페이지에서 다음을 클릭합니다.
  6. 설치 선택 확인 페이지에서 설치를 클릭합니다.
  7. Results(결과) 페이지에서 Close(닫기)를 클릭합니다.

Windows 8 또는 Windows 8.1

  1. 시작 화면에서 포인터를 왼쪽 아래 모서리로 이동하고 시작 단추를 마우스 오른쪽 단추로 클릭한 다음 제어판 클릭합니다.
  2. 제어판프로그램 및 기능을 클릭한 다음 Windows 기능 켜기 또는 끄기를 클릭합니다.
  3. 인터넷 정보 서비스를 확장하고, World Wide Web Services를 확장하고, 상태 및 진단을 확장한 다음, ODBC 로깅을 선택합니다.
    스크린샷은 OD B C 로깅이 선택된 Windows 8 또는 Windows 8.1 대한 상태 및 진단 기능을 보여줍니다.
  4. 확인을 클릭합니다.
  5. 닫기를 클릭합니다.

Windows Server 2008 또는 Windows Server 2008 R2

  1. 작업 표시줄에서 시작을 클릭하고 관리 도구를 가리킨 다음 서버 관리자 클릭합니다.
  2. 서버 관리자 계층 구조 창에서 역할을 확장한 다음 웹 서버(IIS)를 클릭합니다.
  3. 웹 서버(IIS) 창에서 Role Services 섹션으로 스크롤한 다음 역할 서비스 추가를 클릭합니다.
  4. 역할 서비스 추가 마법사역할 서비스 선택 페이지에서 ODBC 로깅을 선택하고 다음을 클릭합니다.
    스크린샷은 OD B C 로깅이 선택된 Windows Server 2008 또는 Windows Server 2008 R2에 대한 상태 및 진단 기능을 보여줍니다.
  5. 설치 선택 확인 페이지에서 설치를 클릭합니다.
  6. Results(결과) 페이지에서 Close(닫기)를 클릭합니다.

Windows Vista 또는 Windows 7

  1. 작업 표시줄에서 시작을 클릭한 다음 제어판 클릭합니다.
  2. 제어판프로그램 및 기능을 클릭한 다음 Windows 기능 켜기 또는 끄기를 클릭합니다.
  3. 인터넷 정보 서비스를 확장한 다음 ODBC 로깅을 선택한 다음 확인을 클릭합니다.
    스크린샷은 OD B C 로깅이 선택된 Windows Vista 또는 Windows 7의 상태 및 진단 기능을 보여줍니다.

방법

IIS 7에 대한 ODBC 로깅을 구성하기 위한 사용자 인터페이스가 없습니다. 프로그래밍 방식으로 ODBC 로깅을 구성하는 방법에 대한 예제는 이 문서의 코드 샘플 섹션을 참조하세요.

구성

특성

attribute Description
dataSource 선택적 문자열 특성입니다. 로그가 기록되는 데이터베이스의 DSN(시스템 데이터 원본 이름)을 지정합니다.

기본값은 InternetDb입니다.
password 선택적 문자열 특성입니다. 이벤트 로깅 중에 데이터베이스에 정보를 쓸 때 사용하는 ODBC 데이터베이스 암호를 지정합니다. 기본적으로 이 값은 암호화됩니다.

기본값은 [enc:AesProvider::enc]입니다.
tableName 선택적 문자열 특성입니다. 이벤트 로깅 중에 Windows가 정보를 쓰는 ODBC 데이터베이스 테이블의 이름을 지정합니다.

기본값은 InternetLog입니다.
userName 선택적 문자열 특성입니다. 이벤트 로깅 중에 데이터베이스에 정보를 쓰는 데 사용되는 ODBC 데이터베이스 사용자 이름을 지정합니다.

기본값은 InternetAdmin입니다.

자식 요소

없음

구성 샘플

기본 웹 사이트에 대한 이 첫 번째 구성 샘플은 ODBC 로깅 연결에 <odbcLogging> 대한 시스템 DSN, 테이블 이름, 사용자 이름 및 암호를 지정하는 요소의 특성을 구성합니다.

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

이 두 번째 구성 샘플은 기본 웹 사이트에 ODBC 로깅을 사용하도록 설정하는 logFile> 요소에서< 올바른 사용자 지정 로깅 특성을 구성합니다.

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

샘플 코드

다음 코드 샘플은 기본 웹 사이트에 대한 두 가지 옵션 집합을 구성합니다.

  • 각 샘플의 처음 절반은 ODBC 로깅 연결에 <odbcLogging> 대한 시스템 DSN, 테이블 이름, 사용자 이름 및 암호를 지정하는 요소의 특성을 구성합니다.
  • 각 샘플의 후반부에서는 ODBC 로깅을 사용하도록 설정하는 logFile> 요소의< 사용자 지정 로깅 특성을 지정합니다.

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