Log Parser(微軟網站下載)是微軟公司出品的日誌分析工具,它功能強大,使用簡單,能夠分析基於文本的日誌文件、XML 文件、CSV(逗號分隔符)文件,以及操做系統的事件日誌、註冊表、文件系統、Active Directory。它能夠像使用 SQL 語句同樣查詢分析這些數據,甚至能夠把分析結果以各類圖表的形式展示出來。css
Log Parser 的安裝很簡單,沒有什麼特別的,安裝以後,能夠在安裝目錄下找到 LogParser.chm 這個文件,該文件是 LogParser 的幫助文件,爲英語語言。html
咱們簡單介紹一下在命令提示符中如何使用 Log Parser。sql
LogParser.exe 爲可執行文件,後跟一個使用 SQL 結構的語句參數進行查詢。數據庫
C:\Program Files\Log Parser 2.2>LogParser "SELECT TOP 10 * FROM System ORDER BY RecordNumber DESC"
從系統日誌(能夠從事件查看器中找到)中,選出按 RecordNumber 逆序的前 10 條記錄。RecordNumber 是 System 中的一個字段。app
咱們也能夠生成圖表:tcp
C:\Program Files\Log Parser 2.2>LogParser "SELECT EventID, Count(*) as 出現次數 INTO Chart.gif FROM System GROUP BY EventID" -chartType:PieExploded3D -groupSize:500x350 -chartTitle:"事件分類"
上述代碼中還加了其它參數來肯定圖表的類型、大小等,獲得相似以下圖表:工具
![Log Parser 生成的圖表](http://static.javashuo.com/static/loading.gif)
是否是很是的簡單,並且很振奮人心,不過這些都不是咱們介紹的重點,咱們的重點是如何利用 C# 去執行 Log Parser。網站
經過 .NET Framework 的 COM interop (COM 交互操做)特性,能夠很方便地在 .NET 應用程序中使用 Log Parser,.NET Framework 的 COM interop 是經過 Runtime Callable Wrappers (RCW) 來實現對 COM 的操做的,RCW 是 .NET 中的一個類。url
咱們用 Log Parser 和 C# 打造網站訪問統計分析系統,就是用 C# 調用 Log Parser,利用 Log Parser 去分析 IIS 的日誌文件。咱們這裏的日誌文件是 W3C 格式的。spa
程序
咱們創建一個 .cs 文件,引入:
using LogQuery = Interop.MSUtil.LogQueryClassClass; using IISInputFormat = Interop.MSUtil.COMIISW3CInputContextClassClass; using LogRecordSet = Interop.MSUtil.ILogRecordset;
類中關鍵代碼以下:
LogQuery oLogQuery = new LogQuery(); IISInputFormat oIISInputFormat = new IISInputFormat(); string query = @"SELECT COUNT(DISTINCT c-ip) AS hits FROM 'C:\WINDOWS\system32\Logfiles\W3SVC1\ex070820.log' WHERE cs-uri-stem like '%.asp' AND sc-status=200"; LogRecordSet oRecordSet = oLogQuery.Execute(query, oIISInputFormat); if (!oRecordSet.atEnd()) { hits = (int)oRecordSet.getRecord().getValue("hits"); } oRecordSet.close();
看得出來跟使用數據庫沒有多大區別,查詢語句中 c-ip、cs-uri-stem、sc-status 等都是日誌文件的字段,直接打開日誌文件能夠找到這些內容。
編譯
程序就完成了,不過還不能直接運行,咱們還要對它編譯,咱們這裏是編譯成 exe,固然您也能夠把它編譯成一個 DLL,供 ASP.NET 一類的文件調用。
須要兩步,第一步:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\TlbImp.exe C:\Program Files\Log Parser 2.2\LogParser.dll /out:E:\Interop.MSUtil.dll
直接下載 Interop.MSUtil.dll。
TlbImp 全稱是 Type Library Importer,它是用於建立 RCW,它一般位於 .NET Framework 的 Bin 目錄下。
若是您使用的是 Visual Studio 2005,也能夠不使用命令提示符的方式,而在工程中直接導入。
第二步:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc /target:exe /reference:E:\Interop.MSUtil.dll /out:E:\logAnal.exe E:\logAnal.cs
logAnal.cs 是咱們前面寫的程序,logAnal.exe 是要生成的 exe 文件,Interop.MSUtil.dll 是前面生成的 DLL。
完成了
就是這麼簡單,沒有什麼複雜的,經過改變查詢語句,能夠實現多種統計。
一、導出爲execl能打開的格式 logparser -i:evt -o:csv "select * from c:\sec.evt" > d:sec.csv logparser -i:evt -o:csv "select * from security" > d:sec.csv logparser -i:evt -o:nat "select * into a.txt from security"
logparser -i:evt -o:csv "select TimeGenerated,EventID,Message from c:\sec.evt" > d:sec.csv
logparser -i:evt -o:TPL -tpl:EventLogs.tpl "select * into b.html from d:\sec.evt"
使用條件語句: SELECT TimeGenerated, EventTypeName, SourceName FROM System WHERE ( SourceName = 'Service Control Manager' AND EventID >= 7024) OR ( SourceName = 'W32Time')
SELECT * FROM Security WHERE Message LIKE '%logon%'
A、在iis日誌中搜索特殊連接 LogParser -o:csv "SELECT * into a.csv FROM iis.log where EXTRACT_EXTENSION(cs-uri-stem) LIKE 'asp'"
B、最經典的例子,對日誌中的url進行歸併統計 LogParser -o:csv "SELECT cs-uri-stem, COUNT(*) into a.csv FROM iis.log GROUP BY cs-uri-stem"
c、統計全部日誌 LogParser -o:csv "SELECT cs-uri-stem, COUNT(*)into a.csv FROM ex*.log GROUP BY cs-uri-stem" LogParser -i:iisw3c -o:csv "SELECT cs-uri-stem, COUNT(*)into a.csv FROM *.log GROUP BY cs-uri-stem"
d、對文件後綴進行排名 LogParser -i:iisw3c -o:csv "SELECT EXTRACT_EXTENSION(cs-uri-stem) AS PageType, COUNT(*) into a.cssv FROM *.log GROUP BY PageType"
e、獲得全部的不重複的連接 LogParser -i:iisw3c -o:csv "SELECT distinct cs-uri-stem into a.csv FROM *.log"
二、生成百分比餅圖 LogParser "SELECT EventID, COUNT(*) AS Times INTO Chart.gif FROM d:\tmp\sec.evt GROUP BY EventID ORDER BY Times DESC" -chartType:PieExploded3D -chartTitle:"Status Codes"
三、http日誌 LogParser file:querytop.sql -o:chart -chartType:Bar3d -chartTitle:"TOP 10 URL"
querytop.sql: SELECT TOP 10 cs-uri-stem AS Url, COUNT(*) AS Hits INTO Urls.gif FROM <1> GROUP BY Url ORDER BY Hits DESC
四、在html頁面裏找關鍵字 Return the lines in an HTML document that contain links to other pages: LogParser "SELECT Text FROM
http://www.microsoft.adatum.com WHERE Text LIKE '%href%'" -i:TEXTLINE
五、MD5 Hashes of System Files LogParser "SELECT Path, HASHMD5_FILE(Path) into a.txt FROM C:\Windows\System32\*.exe" -i:FS -recurse:0
六、Print the 10 largest files on the C: drive: LogParser "SELECT TOP 10 Path, Name, Size FROM C:\*.* ORDER BY Size DESC" -i:FS
七、得到本機登錄賬戶的查看 LogParser.exe -o:nat "SELECT RESOLVE_SID(Sid) AS Account FROM Security WHERE EventID IN (540; 528)"
八、得到系統日誌的分類詳細信息 LogParser "SELECT DISTINCT SourceName, EventID,SourceName,message INTO Event_*.csv FROM security" -i:EVT -o:CSV LogParser "SELECT DISTINCT SourceName, EventID,SourceName,message INTO Event_*.csv FROM System" -i:EVT -o:CSV 根據id分類 LogParser "SELECT DISTINCT eventid, EventID,SourceName,message INTO Event_*.csv FROM System" -i:EVT -o:CSV LogParser "SELECT DISTINCT eventid, EventID,SourceName,message INTO Event_*.csv FROM security" -i:EVT -o:CSV
九、生成圖形界面日誌 LogParser "SELECT 'Event ID:', EventID, SYSTEM_TIMESTAMP(),message FROM security" -i:EVT -o:datagrid
十、生成一個Web頁面 LogParser file:d:\EventLogs.sql?EventLog=security -o:TPL -tpl:d:\EventLogs.tpl LogParser file:d:\EventLogs.sql?EventLog=system -o:TPL -tpl:d:\EventLogs.tpl
十一、在iis日誌裏
查看返回代碼分佈餅圖 LogParser "SELECT sc-status, COUNT(*) AS Times INTO Chart.gif FROM iis.log GROUP BY sc-status ORDER BY Times DESC" -chartType:PieExploded3D -chartTitle:"Status Codes"
十二、在全部日誌中手機前10位的排名 LogParser file:querytop.sql -o:chart -chartType:Bar3d -chartTitle:"TOP 10 URL"
querytop.sql:
SELECT TOP 10 cs-uri-stem AS Url, COUNT(*) AS Hits INTO Urls.gif FROM ex*.log GROUP BY Url ORDER BY Hits DESC
1三、檢索目錄下全部文件的全部的信息 logparser "select * into a.csv from c:\x-scan\*.*" -i:fs -o:csv
查看每一個源IP發了多少個包 LogParser "SELECT srcip ,count(*) into a.csv FROM a.cap group by srcip" -fmode:tcpip -o:csv
查看每一個源端口的包的個數 LogParser "SELECT srcport ,count(*) into a.csv FROM a.cap group by srcport" -fmode:tcpip -o:csv
歸併全部srcip,dstip,srcport同樣的包,獲得個數 LogParser "SELECT srcip,dstip,srcport ,count(*) into a.csv FROM a.cap group by srcip,dstip,srcport" -fmode:tcpip -o:csv
歸併全部tcpflags的包 LogParser "SELECT srcip,srcport,dstip,dstport,tcpflags,count(*) into a.csv FROM a.cap where tcpflags='AF' group by srcip,srcport,dstip,dstport,tcpflags" -fmode:tcpip -o:csv
tcpflags的分佈餅圖 LogParser "SELECT tcpflags,count(*) into a.gif FROM a.cap group by tcpflags " -fmode:tcpip -chartType:PieExploded3D -chartTitle:"Status Codes" LogParser "SELECT tcpflags,count(*) into a.csv FROM a.cap group by tcpflags " -fmode:tcpip -o:csv