IISのログファイルをSQL ServerにSaveする


IIS のログファイルを SQL Serverのテーブルに保存することができます。
ポイント:C# で書かれた sqlLoggingモジュールの/App_Code への配置

  1. 手順概要
  2. まず、SQL Server に IISのログ保存用のデータベースとテーブルを用意します。

    “/” ディレクトリに App_Code フォルダを作成し、
    C# で書かれた sqlLoggingモジュール(sqlLoggingModule.cs)  を
    /App_Code/sqlLoggingModule.cs に配置し、
    /web.config にこれを利用するための設定を記述します。

    /windows/system32/inetsrv/config/schema/sqlLogging_schema.xml を作成し、
    /windows/system32/inetsrv/config/pplicationHost.config ファイルを更新します。

    また、 .cs ファイルは以下の dll が実行しています。
    /windows/system32/inetsrv/Microsoft.Web.Administration.dll
    (/web.config にて assembly=”Microsoft.Web.Administration …. )

    以下、手順詳細となります。

    参考 : Building an IIS7 SQL Logging Module with .NET

    1

  3. データベースとテーブルの作成

    以下の SQL を利用して、IISのログファイルを保存するための新しいデータベースとテーブルを作成

    今回のサンプルスクリプトでは “sa” で接続するため、sa でログインできることが必要( SQL Server認証 )

    USE [master]
    GO
    CREATE DATABASE [MIX] ON  PRIMARY
    ( NAME = N'mix',
      FileName='C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\mix.mdf' )
    GO
    USE [MIX]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Log](
        [Date] [datetime],
        [Method] [varchar](50) NULL,
        [IPAddress] [varchar](50) NULL,
        [Url] [varchar](255) NULL,
        [UserName] [varchar](255) NULL,
        [UserAgent] [varchar](255) NULL,
        [ResponseCode] [varchar](50) NULL,
        [SiteName] [varchar](50) NULL,
        [ApplicationName] [varchar](50) NULL
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF


    2

  4. 処理用プログラムの配置
    サイトに App_Code フォルダを作成し、sqlLoggingModule.cs を配置します。

    右図の例ではPHPTrainingKitLabs サイトは PhpOnWindowsTrainingKit/Labs がTOPディレクトリ “/” として設定されています。

    /App_Code/sqlLoggingModule.cs

    using System;
    using System.Data;
    using System.Web;
    using System.Web.Security;
    using System.Data.SqlClient;
    using System.Web.Hosting;
    using Microsoft.Web.Administration;
    
    public class SqlLoggingModule : IHttpModule
    {
      public SqlLoggingModule()
       {
        }
    
        public void Dispose()
        {
        }
    
        public void Init(HttpApplication context)
        {
            context.LogRequest += new EventHandler(context_LogRequest);
        }
    
        void context_LogRequest(object sender, EventArgs e)
        {
          HttpApplication application = (HttpApplication)sender;
          LogRequest(application.Context);
        }
    
        private void LogRequest(HttpContext httpContext)
        {
          string connectionString = GetConnectionString(httpContext);
    
          using (SqlConnection connection = new SqlConnection(connectionString)) {
    
            SqlCommand cmd = connection.CreateCommand();
            cmd.CommandText =
                "insert into Log
                 (Date, Method, IPAddress, Url, UserName,
                   UserAgent, ResponseCode, SiteName, ApplicationName) values" +
                 "(@Date, @Method, @IPAddress, @Url, @UserName,
                   @UserAgent, @ResponseCode, @SiteName, @ApplicationName)";
    
            cmd.Parameters.AddWithValue("@Date", DateTime.Now);
            cmd.Parameters.AddWithValue("@Method", httpContext.Request.HttpMethod);
            cmd.Parameters.AddWithValue("@IPAddress", httpContext.Request.UserHostAddress);
            cmd.Parameters.AddWithValue("@Url", httpContext.Request.Url.ToString());
            cmd.Parameters.AddWithValue("@UserName", httpContext.Request.ServerVariables["LOGON_USER"]);
            cmd.Parameters.AddWithValue("@UserAgent", httpContext.Request.UserAgent);
            cmd.Parameters.AddWithValue("@ResponseCode", httpContext.Response.StatusCode + "."
                  + httpContext.Response.SubStatusCode);
            cmd.Parameters.AddWithValue("@SiteName", HostingEnvironment.SiteName);
            cmd.Parameters.AddWithValue("@ApplicationName", httpContext.Request.ApplicationPath);
    
            connection.Open();
            cmd.ExecuteNonQuery();
          }
        }
    
        private string GetConnectionString(HttpContext httpContext)
        {
          ConfigurationSection section = WebConfigurationManager.GetSection("system.webServer/sqlLogging");
          return (string)section["connectionString"];
        }
    
    }
  5. /web.config に以下を追記
    Microsoft.Web.Administration および sqlLogging について追記します。

    <configuration>
    <system.web>
    <compilation debug="true">
      <assemblies>
      <add assembly="Microsoft.Web.Administration, Version=7.0.0.0,Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          </assemblies>
        </compilation>
    </system.web>
    <system.webServer>
    ・・・・・・・・・・・・・
    ・・・・・・・・・・・・・
      <modules>
        <add name="sqlLoggingModule" type="SqlLoggingModule" />
      </modules>
      <sqlLogging connectionString="server=あなたのサーバ名\sqlexpress;database=MIX;uid=sa;pwd="sa" />
    
    </system.webServer>
    </configuration>
  6. /windows/system32/inetsrv/config/schema/sqlLogging_schema.xml を作成
    <configSchema>
    <sectionSchema name="system.webServer/sqlLogging">
    <attribute name="connectionString" type="string" />
    </sectionSchema>
    </configSchema>

    /windows/system32/inetsrv/config/schema/applicationHost.config を編集
    sqlLogging のセクションを追加します。

    <sectionGroup name="system.webServer">
        <section name="sqlLogging" overrideModeDefault="Allow" />
  7. SQL Serverに保存されたIISログファイルの確認
    設定したサイトにアクセスし、SQL Serverにログが記録されていることを確認します。

    3

以上


タグ:


コメントをどうぞ