利用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、 双击“功能视图”中的 “日志”项,设置日志路径。

      利用LogParser把IIS日志导入数据库中

  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,如图:

      利用LogParser把IIS日志导入数据库中

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

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

      利用LogParser把IIS日志导入数据库中

六、建立计划任务

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

  利用LogParser把IIS日志导入数据库中

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

你可能感兴趣的:(parser)