zoukankan      html  css  js  c++  java
  • 利用LogParser把IIS日志导入数据库中

    一、概述

      目前很多网站都用IIS日志来做统计,最近在公司把这个统计系统由一个物理机升级到三台虚拟机上,建立计划任务时,遇到一些问题,记录下来过程,供后来人参考。

      实现原理:

      新建一个站点tj.elong.com,这个站点只有一张1像素的图片tj.gif,当需要统计数据时,可以访问这个图片,把需要统计的数据当作参数(如:http://tj.elong.com/tj.gif?TableName=TjTest&OrderId=123456 ),每次访问都会记录在IIS日志中,编写一个vbs利用LogParser小工具把IIS日志导入到数据库中,然后再根据需要对数据进行分析处理。下面介绍的是Win7系统下,在本地建立这一套机制。

    二、IIS设置

      1、  IIS设置

        A、 新建tj.elong.com站点,此站点包含一张1像素的图片tj.gif。

        B、 双击“功能视图”中的 “日志”项,设置日志路径。

          

      2、  查看日志信息,确认日志记录正常

        A、设置hosts把tj.elong.com指向127.0.0.1

        B、访问http://tj.elong.com/tj.gif,并查看IIS日志信息,确认站点OK

    三、安装LogParser

      可以从http://download.csdn.net/detail/fuhongxue2011/3729508下载,双击安装。

    四、创建数据库表并编写SQL

      1、  创建数据库表

        在本地建立数据库Log_IIS,在数据库中建立表Online_tj,创建表的SQL如下:

    View Code
    USE [Log_IIS]
    GO

    /****** Object: Table [dbo].[Online_tj] Script Date: 10/28/2011 17:08:28 ******/
    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Online_tj]') AND type in (N'U'))
    DROP TABLE [dbo].[Online_tj]
    GO

    USE [Log_IIS]
    GO

    /****** Object: Table [dbo].[Online_tj] Script Date: 10/28/2011 17:08:28 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[Online_tj](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [logtime] [datetime] NULL,
    [s_ip] [varchar](255) NULL,
    [cs_method] [varchar](255) NULL,
    [cs_uri_stem] [varchar](255) NULL,
    [cs_uri_query] [varchar](1024) NULL,
    [s_port] [int] NULL,
    [cs_username] [varchar](255) NULL,
    [c_ip] [varchar](255) NULL,
    [cs_User_Agent] [varchar](255) NULL,
    [sc_status] [int] NULL,
    [sc_substatus] [int] NULL,
    [sc_win32_status] [int] NULL,
    [time_taken] [int] NULL,
    CONSTRAINT [PK__Online_tj__164452B1] PRIMARY KEY CLUSTERED
    (
    [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO


    USE [Log_IIS]
    /****** Object: Index [IX_Online_tj_CI_LCCC] Script Date: 10/28/2011 17:08:29 ******/
    CREATE NONCLUSTERED INDEX [IX_Online_tj_CI_LCCC] ON [dbo].[Online_tj]
    (
    [cs_uri_stem] ASC,
    [ID] ASC
    )
    INCLUDE ( [logtime],
    [c_ip],
    [cs_uri_query],
    [cs_User_Agent]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO


    USE [Log_IIS]
    /****** Object: Index [ix_Online_tj_logtime] Script Date: 10/28/2011 17:08:29 ******/
    CREATE NONCLUSTERED INDEX [ix_Online_tj_logtime] ON [dbo].[Online_tj]
    (
    [logtime] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO

      2、  编写logparser所用的插入数据的SQL

        此SQL功能:从日志中选出数据,插入数据库表中

    View Code
    /*

    logparser file:tj_insert.sql?start=starttime+end=endtime+log=logfilename
    input parameter:
    start - starttime example:1:00:00 or 18:00:00
    end - endtime example:1:09:59 or 18:59:59
    log - logfilename example:ex10111601 or ex10111618

    */

    Select TO_TIMESTAMP(date,time), TO_TIMESTAMP(date,time), s-ip, cs-method, cs-uri-stem, cs-uri-query, s-port, cs-username, c-ip,
    cs(User-Agent), sc-status, sc-substatus, sc-win32-status, time-taken
    INTO
    Log_IIS.dbo.Online_tj
    FROM
    E:\tj\IISLog\W3SVC10\%log%.log
    WHERE TO_LOCALTIME(Time) BETWEEN TO_TIMESTAMP('%start%','h:mm:ss') AND TO_TIMESTAMP('%end%','h:mm:ss')

    五、编写VBS

      1、  编写tj.vbs

        功能:调用并执行上面写的Sql语句

    View Code
    d = DateAdd("n", -6, Now())
    strDate = Right(""&(100+Year(d)),2) & Right(""&(100+Month(d)),2) & Right(""&(100+Day(d)),2)

    strHr = Hour(time())
    strMin = Minute(time())
    starttime = timeserial(strHr, strMin - 6, 0)
    endtime = timeserial(strHr, strMin - 2, 59)

    strHr = Right(""&(100+Hour(starttime)),2)
    logfilename = "u_ex" & strDate
    Set WshShell = Wscript.CreateObject("Wscript.Shell")

    Wscript.Echo starttime &":"& endtime &":"&logfilename

    strCMD = "LogParser file:E:\tj\tj_insert.sql?start=" & starttime &_
    "+end=" & endtime & "+log=" & logfilename &_
    " -iw:ON -i:iisw3c -o:sql -oConnString:""Driver={SQL Server};Server=(local);db=Log_IIS;uid=sa;pwd=123"""
    Wscript.Echo strCMD
    WshShell.run strCMD, 1, false

      2、  测试VBS

        测试这个vbs时,遇到了一个不大不小的问题,如果使用开始中LogParser 2.2运行vbs,则数据可以写入数据库,如果直接使用cmd运行,则数据不能写入数据库。

        解决办法有两个:

        A、 把cmd的路径指向c:\Program Files\Log Parser 2.2再运行vbs,如图:

          

        B、 在环境变量中加入c:\Program Files\Log Parser 2.2即可

          右击我的电脑 - - 属性 - - 更改设置 - - 高级 - - 环境变量 - - 系统变量中的“Path” - - 编辑 - - 在最后加上c:\Program Files\Log Parser 2.2如下图

          

    六、建立计划任务

      控制面板 - - 系统和安全 - - 管理工具最后一项“计划任务” - - 创建基本任务 - - 创建好了双击刚刚建立的计划任务,在触发器选项卡中选中任务,然后点击下面的编辑,可以设置为每5分钟运行一次。操作选项卡中,选中任务,点击编辑,如果电脑的环境变量中设置了c:\Program Files\Log Parser 2.2路径的话,启动程序中“起始于”就不用填了,如果没有设置的话,起始于要填上c:\Program Files\Log Parser 2.2。如下图:

      

    Windows 2003系统和Win7系统大同小异,部分功能没有特别细致的介绍,有什么问题欢迎拍砖。

  • 相关阅读:
    泛型与非泛型
    C# 调用CMD,执行DOS命令
    数据库设计随笔(ZZ)
    关于三层开发(zz)
    三层架构学习(转)
    Node.js & child_process All In One
    HTML5 Canvas Tag Cloud All In One
    macOS & VSCode terminal show current git branch All In One
    飞书 excel 固定列 All In One
    git diff one of committed file All In One
  • 原文地址:https://www.cnblogs.com/puwei222/p/2229313.html
Copyright © 2011-2022 走看看