日志分析,特別是IIS日志,一般人都會(huì)想到LogParser工具,的確很強(qiáng)。Log Parser?是一個(gè)專門解析IIS日志的工具,我們可以用它來(lái)查看日志中的信息。
比如我可以運(yùn)行下面的命令行(說(shuō)明:為了不影響頁(yè)面寬度我將命令文本換行了):
C:\Program Files\Log Parser 2.2\LogParser.exe -i:IISW3C -o:DATAGRIDSELECT c-ip,cs-method,s-port,cs-uri-stem,sc-status,sc-win32-status,sc-bytes,cs-bytes,time-taken FROM u_ex130615.log
現(xiàn)在就可以以表格形式來(lái)閱讀IIS日志了:
說(shuō)明:我不推薦用這種方法來(lái)分析IIS日志,原因有二點(diǎn):
1. 慢:當(dāng)日志文件稍大一點(diǎn)的時(shí)候,用它來(lái)分析就比較浪費(fèi)時(shí)間了(尤其是需要多次統(tǒng)計(jì)時(shí))。2. 不方便:它支持的查詢語(yǔ)法不夠豐富,沒(méi)有像SQL Server針對(duì)數(shù)據(jù)表查詢那樣全面。
雖然Log Parser支持將解析的IIS日志以表格形式供人閱讀,但是有時(shí)候我們需要再做一些細(xì)致分析時(shí),可能會(huì)按不同的方式進(jìn)行【多次】查詢, 對(duì)于這種需求,如果每次查詢都直接運(yùn)行Log Parser,你會(huì)浪費(fèi)很多時(shí)間。 幸運(yùn)的是,Log Parser支持將解析結(jié)果以多種格式導(dǎo)出(以下為幫助文檔截圖):
在此,我建議選擇輸出格式為 SQL 。注意:這里的SQL并不是指SQLSERVER,而是指所有提供ODBC訪問(wèn)接口的數(shù)據(jù)庫(kù)。我可以使用下面的命令將IIS日志導(dǎo)入到SQLSERVER中(說(shuō)明:為了不影響頁(yè)面寬度我將命令文本換行了):
C:\Program Files\Log Parser 2.2\logparser.exe SELECT ?* ?FROM ?'D:\Temp\u_ex130615.log' ?to MyMVC_WebLog -i:IISW3C -o:SQL-oConnString:Driver={SQL Server};server=local\sqlexpress;database=MyTestDb;Integrated Security=SSPI-createtable:ON
導(dǎo)入完成后,我們就可以用熟悉的SQLSERVER來(lái)做各種查詢和統(tǒng)計(jì)分析了,例如下面的查詢:
SELECT cip,cethod,sport,csuristem,scstatus,scwin32status,scbytes,cytes,timetakenFROM dbo.MyMVC_WebLog如果如下:
注意:1. IIS日志在將結(jié)果導(dǎo)出到SQLSERVER時(shí),字段名中不符合標(biāo)識(shí)符規(guī)范的字符將會(huì)刪除。???例如:c-ip 會(huì)變成 cip, s-port 會(huì)變成 sport 。2. IIS日志中記錄的時(shí)間是UTC時(shí)間,而且把日期和時(shí)間分開了,導(dǎo)出到SQLSERVER時(shí),會(huì)生成二個(gè)字段:???
date, time這二個(gè)字段看起來(lái)很不舒服,對(duì)吧?我也很反感這個(gè)結(jié)果,下面來(lái)說(shuō)說(shuō)的二種解決方法:
1. 在SQLSERVER中增加一列,然后把UTC時(shí)間換成本地時(shí)區(qū)的時(shí)間,T-SQL腳本如下:
alter table MyMVC_WebLog add Time datetimegoupdate MyMVC_WebLog set Time=dateadd(hh,8,convert(varchar(10),date,120) ? ? ? ? ? ?+ ' ' + convert(varchar(13),time,114))
2. 直接在導(dǎo)出IIS日志時(shí),把時(shí)間轉(zhuǎn)換過(guò)來(lái),此時(shí)要修改命令:
C:\Program Files\Log Parser 2.2\logparser.exeSELECT TO_LOCALTIME(TO_TIMESTAMP(ADD(TO_STRING(date, 'yyyy-MM-dd '), TO_STRING(time, 'hh:mm:ss')),'yyyy-MM-dd hh:mm:ss')) AS Time, * ?FROM ?'D:\Temp\u_ex130615.log' ?to ?MyMVC_WebLog2 -i:IISW3C -o:SQL-oConnString:Driver={SQL Server};server=local\sqlexpress;database=MyTestDb;Integrated Security=SSPI-createtable:ON
再看這三列:
select Time, date, time from MyMVC_WebLog2
這樣處理后,你就可以直接把date, time這二列刪除了(你也可以在導(dǎo)出IIS日志時(shí)忽略它們,但要明確指出每個(gè)字段名)。
迅速啟動(dòng)LogParser:進(jìn)入命令行模式:輸入:?LOGPARSER -i:IISW3C file:D:/Log/log_SQL/Slowest10IPInIIS_MySite.sql -o:DataGrid -q:off?其中,Slowest20FilesInIIS_MySite.sql的內(nèi)容如下:
[ruby]?view plaincopyprint?
--rem?運(yùn)行最慢的20個(gè)頁(yè)面??
--Finding?the?20?slowest?pages?in?your?Web?site??
Select?Top?20??
????LogRow?as?[Line?Number],??
????date?as?[Date],??
????time?as?[Time],??
????c-ip?as?[Client-IP],??
????s-ip?as?[Server?IP],???
????s-port?as?[Server?Port],??
????cs-method?as?[?Verb],??
????cs-uri-stem?as?[?URI],??
????sc-bytes?as?[Bytes?sent],??
????sc-status?as?[Status],??
????sc-substatus?as?[Sub-status],??
????sc-win32-status?as?[Win?32?Status],??
????time-taken?as?[Time?Taken]??
From???
????D:/Log/log_SQL/LogFiles/ex*.log??
Order?by?time-taken?desc??
執(zhí)行結(jié)果如圖:從圖中可以看出,訪問(wèn)最慢而且最頻繁的頁(yè)面是/Company/List.aspx, 而且集中在一個(gè)IP: 116.7.16.249? ,基本可以肯定主·這是有人惡意爬數(shù)據(jù) ,再輸入:
LOGPARSER -i:IISW3C file:D:/Log/log_SQL/Slowest10IPInIIS_MySite.sql -o:DataGrid -q:off其中,Slowest10IPInIIS_MySite.sql的內(nèi)容如下:
[ruby]?view plaincopyprint?
--rem?訪問(wèn)量最大的IP的訪問(wèn)明細(xì)??
Select?cs-uri-stem?as?[URI],count(cs-uri-stem)?as?VisitCounts,c-ip?as?[ClientIP]??
FROM???
D:Log/log_SQL/LogFiles/ex090829.log??
group?by?cs-uri-stem,c-ip???
ORDER?BY?VisitCounts?DESC??
啟動(dòng)管理工具,禁IP?。?!
中甲直播