一、概述
目前很多網站都用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://www.wfuwu.com/down/html/logparser.html下載,雙擊安裝。
四、創建數據庫表并編寫SQL
1、 創建數據庫表
在本地建立數據庫Log_IIS,在數據庫中建立表Online_tj,創建表的SQL如下:
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功能:從日志中選出數據,插入數據庫表中
/*
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: jIISLogW3SVC10\%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語句
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: j j_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 FilesLog Parser 2.2再運行vbs,如圖:
B、 在環境變量中加入c:Program FilesLog Parser 2.2即可
右擊我的電腦 - - 屬性 - - 更改設置 - - 高級 - - 環境變量 - - 系統變量中的“Path” - - 編輯 - - 在最后加上c:Program FilesLog Parser 2.2如下圖
六、建立計劃任務
控制面板 - - 系統和安全 - - 管理工具最后一項“計劃任務” - - 創建基本任務 - - 創建好了雙擊剛剛建立的計劃任務,在觸發器選項卡中選中任務,然后點擊下面的編輯,可以設置為每5分鐘運行一次。操作選項卡中,選中任務,點擊編輯,如果電腦的環境變量中設置了c:Program FilesLog Parser 2.2路徑的話,啟動程序中“起始于”就不用填了,如果沒有設置的話,起始于要填上c:Program FilesLog Parser 2.2。如下圖:
Windows 2003系統和Win7系統大同小異,部分功能沒有特別細致的介紹,有什么問題歡迎拍磚。
(文章來源:http://fuhongxue2011.cnblogs.com/ 作者:傅紅雪2011)