Log Parser 2.2 如何運作

作者:
Gabriele Giuseppini 
(Microsoft Corporation 的軟件開發測試工程師)

審稿人
Jeffrey A. Johnson(Microsoft Corporation 的軟件開發測試工程師)

本頁內容
簡介 簡介
Log Parser 如何運作? Log Parser 如何運作?
搜索數據 搜索數據
將日誌導出到 SQL 數據庫 將日誌導出到 SQL 數據庫
創建報表 創建報表
總結 總結
更多信息 更多信息
*

簡介

近幾年,我有許多次被問到“Log Parser 有何用處?”這一問題。每次,我都感到很難找到適當的語言來描述這個工具。每當我找到了一句話來進行描述的時侯,隨後都會發現這句話遺漏了一些重要的內容,無法真正表達出該工具的靈活性。當然,這可能是由於開發人員的偏執造成的,不過我對自己的回答,從來沒有感到滿意過。

我不會告訴您,Log Parser“能做”什麼。 能用它來做什麼,纔是關鍵。我有很多次都對 Log Parser 的一些特殊應用感到很吃驚,我原以爲它們是不可能實現的。我將告訴您它是 如何 運作的,希望這能讓您懂得能用它來做什麼,而且我會向您介紹該工具的三種最常見的應用方案。我敢肯定,您也會對 Log Parser 的新用途感到吃驚的。

歷史點滴

在我們介紹 Log Parser 的內部原理之前,您可能想了解一下該工具的歷史背景。2.0 版是 Microsoft 對外發布的第一個版本。Log Parser 1.0 是 Microsoft 的內部測試工具,幾年前由本人開發而成,用於實現 IIS 日誌記錄功能的自動化測試。由於這個工具吸引了許多內部用戶,因此本人於 2001 年 11 月推出了 2.0 版,並在 Internet 上提供了免費下載。

不久後,2.1 版隨 IIS 6.0 資源工具包一同發佈。該工具包包含有對 SQL 引擎功能的重要更新。

最後,2.2 版(目前的版本)於 2005 年 1 月推出。該版本包含了大量輸入和輸出格式,以及針對 SQL 引擎核心的其它一些重要更新。

Log Parser 如何運作?

Log Parser 使用戶可以根據需要混合和匹配 輸入格式 和 輸出格式,來創建數據處理管道。該工具使用以一種 SQL 語言編寫的查詢,在上述兩個組件間創建管道。

輸入格式

輸入格式組件能夠從各種源,讀取並返回信息。輸入格式提供的信息類似於數據庫表,其中的記錄由許多字段組成,而每個字段帶有的值屬於下列五種可能的數據類型之一:INTEGER、STRING、TIMESTAMP、REAL 和 NULL。

Log Parser 2.2 提供的輸入格式包括:

分析 IIS 生成的日誌文件並返回日誌中的條目的輸入格式

分析通用文本日誌文件(按 CSV、TSV、NCSA、W3C 和 XML 標準進行格式化)並返回日誌所含字段的輸入格式

一個返回來自 Windows 事件日誌的事件的輸入格式

返回 Active Directory 對象、文件和目錄以及註冊表項上的信息的輸入格式

一個分析 NetMon 捕獲文件並返回 TCP/IP 數據包和連接上的信息的輸入格式

假如沒有一個可用的輸入格式滿足我們的需求,Log Parser 2.2 還允許您編寫自定義的 輸入格式插件。這些都是簡單的 COM 對象,可以用任何編程語言(包括 C# 和腳本語言)來編寫。您所要做的就是確定要讓插件返回何種信息,只要實現了該插件,就可以像“標準”輸入格式那樣使用。

輸出格式

輸出格式的作用與輸入格式正好相反:使用 記錄,並用記錄中的字段執行一些有用的功能。Log Parser 2.2 提供的輸出格式能夠:

將記錄保存到文本文件(按 CSV、TSV、W3C 和 XML 標準格式化)

將記錄保存到文本文件(根據特定於用戶的通用模板格式化)

將記錄顯示到控制檯或 GUI 窗口中

將記錄上載到 SQL 數據庫的表中

按 Syslog 標準格式化記錄,並將記錄分配給 Syslog 服務器、文本文件或用戶

創建 Excel 樣式的圖表,以圖形格式呈現記錄的數值數據

同樣,如果沒有一個可用的輸出格式滿足您的需求,您還可以通過編程方式,利用 Log Parser COM 對象,來使用記錄。

核心 SQL 引擎

在輸入和輸出格式間有一個數據處理引擎,能夠通過一種 SQL 語言執行查詢。Log Parser 查詢實際上是一種用於粘連輸入格式和輸出格式的一種“膠水”,指定如何在輸入格式提供的數據到達輸出格式之前,對其進行轉換。

這種“膠水”最簡單的實例就是“SELECT *”查詢。該查詢用於指示應該將來自輸入格式的記錄,按原樣傳輸給輸出格式。通常,在 轉換 文件格式時,使用這個簡單的查詢:比如,選擇一個能夠分析源文件中的數據的輸入格式和一個按目標格式將記錄寫入文件的輸出格式,並使用“SELECT *”傳輸未經處理的記錄。

不過,SQL 語言設計用於執行較簡單的“SELECT *”更重大的任務。您可以使用 Log Parser,對來自輸入格式的數據進行篩選、排序和聚合,將您的計算結果發送到可顯示和/或存儲您所提取的信息的輸出格式。

命令行與可編腳本的 COM 對象

您可以通過兩種不同的方法使用 Log Parser:從命令行使用“LogParser.exe”可執行文件;從應用程序使用“LogParser.dll”庫導出的 Log Parser COM 對象。具體要選擇何種方法,取決於您要通過 Log Parser 來執行的任務。

在下面所介紹的幾種應用方案中,我將使用命令行可執行程序,但是請記住,也可以使用 Log Parser COM 對象,通過腳本來實現這些方案。很靈活,不是嗎?

搜索數據

Log Parser 最常見的應用之一是:在一組特定的數據中,搜索特定的信息。想象一下您正在管理一個 IIS 網站,並且被告知,有些用戶發現一些未指定的頁需要很長的執行時間。

您可能想查明的第一件事就是:究竟是哪些頁需要如此長的執行時間。需要通過記事本打開 IIS 日誌文件,查看數百萬行日誌條目嗎?我可不這麼認爲。 假如您將 IIS 日誌存儲在 SQL 數據庫中,您可能想運行一個查詢,來找出運行時間超過 10 秒鐘的頁——如果您真的這麼做了,那麼可能就不需要 Log Parser——至少對於這個問題是這樣。要是您沒有把日誌保存在 SQL 數據庫中,又該怎麼辦呢?在這種情況下,您可以使用 Log Parser 分析 IIS 日誌文件,查明哪些頁所需的執行時間超過了 10 秒鐘,並將結果顯示在控制檯窗口中。

具體方法如下。假定 IIS Web 服務器以 W3C 擴展的日誌格式記錄日誌,而您使用 IISW3C 輸入格式,分析 IIS 日誌文件。

在運行任何查詢之前,您需要這個輸入格式導出了哪些字段。若要確定這一點,請轉到命令行,確認 LogParser.exe 在路徑中,並執行該命令:

C:/>logparser –h –i:IISW3C

這個命令提供了有關 IISW3C 輸入格式的簡明的幫助,其中包含一個列有 IISW3C 輸入格式導出的所有字段的列表:

LogFilename (S)       LogRow (I)            date (T) time (T)              c-ip (S)              cs-username (S) s-sitename (S)        s-computername (S)    s-ip (S) s-port (I)            cs-method (S)         cs-uri-stem (S) cs-uri-query (S)      sc-status (I)         sc-substatus (I) sc-win32-status (I)   sc-bytes (I)          cs-bytes (I) time-taken (I)        cs-version (S)        cs-host (S) cs(User-Agent) (S)    cs(Cookie) (S)        cs(Referer) (S) s-event (S)           s-process-type (S)    s-user-time (R) s-kernel-time (R)     s-page-faults (I)     s-total-procs (I) s-active-procs (I)    s-stopped-procs (I)

根據上述輸出,並藉助IIS 日誌記錄文檔,您就可以知道所要的是所有“time-taken”字段大於 10,000(“time-taken”字段用於測量執行頁所需的 毫秒 數)的日誌條目的“cs-uri-stem”字段。 that the page takes to execute).圓括號中的字母代表字段的 類型。“cs-uri-stem”字段屬於 STRING 類型,而“time-taken”字段則屬於 INTEGER 類型。

然後,定位到保存 IIS 日誌文件的文件夾,並執行此命令:

C:/Logs>logparser "SELECT cs-uri-stem FROM ex*.log WHERE time-taken > 10000" –i:IISW3C

根據日誌文件的大小,您可能需要等待幾秒鐘的時間,該命令纔會開始輸出結果。輸出示例如下:

cs-uri-stem ------------------- /home/login.asp /home/login.asp /home/login.asp /home/login.asp /images/button.gif /home/login.asp /home/login.asp /home/login.asp /home/login.asp /home/login.asp Press a key...

首先,請注意,我們使用了“-i:IISW3C”來指定輸入格式。這個參數告訴 Log Parser,我們要讓 IISW3C 輸入格式,爲我們生成數據。

其次,請注意,我們並未指定任何輸出格式;在這種情況下,Log Parser 會自動選擇“NAT”輸出格式,後者將在控制檯窗口中,顯示查詢記錄。實際上,這個輸出格式在顯示完十個記錄後,就會暫停。它在等您按一下鍵盤上的任意鍵,隨後將再次顯示十個記錄。

最後,請注意,我們的 SQL 查詢的 FROM 子句指定了我們要讓輸入格式分析的數據的實際的 。對於 IISW3C 輸入格式,我們可以指定任意數量的本地或遠程文件(甚至包含通配符)。您可以在 FROM 子句中,指定更多的參數,但我不會在這裏談論這些選項——您可以在 Log Parser 說明文檔的“輸入格式”下,找到這些參數。

現在,回到我們所給的例子上,您可以從結果中看到,多數情況下,“login.asp”頁的執行時間較長。不過,您也可能看到,其它一些頁的加載時間,有時也會超過十秒鐘,所以您還可能想找出每個不同的頁出現過多少次執行時間超過十秒鐘的情況。在輸出中,出現次數較少的頁,可能只是日誌中的假“噪聲”。

那麼,繼續運行以下命令:

C:/Logs>logparser "SELECT TOP 10 cs-uri-stem, COUNT(*) FROM ex*.log WHERE time-taken > 10000 GROUP BY cs-uri-stem ORDER BY COUNT(*) DESC" –i:IISW3C

具體輸出可能如下所示:

cs-uri-stem              COUNT(ALL *) ------------------------ ------------ /home/login.asp          371 /images/lglogo.gif       2 /images/button.gif       1 /news/today.htm          1

這將命令 Log Parser 執行以下操作:

1.

查找所有頁執行時間超過十秒鐘的日誌條目

2.

對於結果中每個不同的 頁 URL,計算頁 URL 在結果中出現的次數——換句話說,某個頁出現過多少次執行時間超過十秒鐘的情況

3.

按照從大到小的順序,對所算出的出現次數的結果進行排序,並且僅顯示前十個結果

根據上方的輸出,您可以做出這樣的結論:“login.asp”頁頻繁出現執行時間超過十秒鐘的情況;結果中的其它頁只是一些假條目,不能表明存在任何具體的問題。

將日誌導出到 SQL 數據庫

對於許多用戶,Log Parser 所實現的查詢功能並不能滿足他們的需求。譬如,管理流量繁重的網站的公司通常需要將網站日誌保存在中央數據庫中,從而可以在其中運行任意數量的查詢,並在多臺 Web 服務器間關聯數據。Windows 事件日誌及其它日誌文件也可能存在這樣的情況。

Log Parser 也可通過提供一個可用於將查詢結果上載到數據庫表的“SQL”輸出格式,來應對上述情況。

一般而言,從日誌文件到 SQL 表的簡單“SELECT *”查詢就可能解決問題,但是大多數時候,日誌包含的一些條目,並不值得永久保存在數據包中。譬如,您可能想排除對圖像文件的請求;也可能存在對不存在的頁的請求。

以下命令可以做到這一點:

C:/Logs>logparser "SELECT * INTO LogsTable FROM ex*.log WHERE TO_LOWERCASE (EXTRACT_EXTENSION(cs-uri-stem)) NOT IN ('gif';'jpg';'png') AND sc-status <> 404" –i:IISW3C –o:SQL –database:LogsDatabase

這個命令要求 Log Parser 篩選出以“.gif”、“.jpg”和“.png”結尾的頁的條目(URL 不分大小寫)。該命令還將排除 HTTP 錯誤代碼“404”(即“page not found”)產生的請求。

所有其它請求都將傳遞給 SQL 輸出格式,後者將把記錄保存到 INTO 子句所指定的表中。另外,這個輸出格式還接受“database”參數(可用於指定目標數據庫的名稱)以及其它許多參數(可用於指定到 SQL 數據庫連接的其它屬性)。

若要實現上述操作,您可以將上面的命令放在一個批處理文件中,並使用 SCHTASKS.EXE 工具,設定該批處理文件每小時運行一次——好了!——您就得到了一個自動的機制,可定期將日誌文件中的條目,上載到 SQL 數據庫。

請注意,每次執行上述命令時,Log Parser 都會反覆檢查 所有 日誌條目,並將所有這些條目多次上載到數據庫。我們真正需要的是一個“僅分析尚未分析過的日誌條目”的機制。

Log Parser 2.2 的一個新功能正好可以滿足這一要求:“增量分析”功能,也稱爲“檢查點 (checkpointing)”。

大多數 Log Parser 輸入格式支持一個名爲“iCheckpoint”的參數。該參數可告訴輸入格式將所分析的所有文件的當前狀態,都保存在一個專門的數據文件(“檢查點 (checkpoint)”文件)中。當您使用上一次分析期間生成的檢查點文件執行查詢時,輸入格式將只分析輸入文件中那些尚未分析過的部分——即 新的 條目。

所以,只需指定通過“iCheckpoint”參數,指定一個檢查點文件的名稱,具體如下:

C:/Logs>logparser "SELECT * INTO LogsTable FROM ex*.log WHERE TO_LOWERCASE (EXTRACT_EXTENSION(cs-uri-stem)) NOT IN ('gif';'jpg';'png') AND sc-status <> 404" –i:IISW3C –o:SQL –database:LogsDatabase –iCheckpoint:MyCheckpoint.lpc

在您第一次執行該命令時,並不存在“MyCheckpoint.lpc”文件,而且 IISW3C 輸入格式分析了所有日誌文件中的所有條目,並對結果數據進行篩選,最後再上載到數據庫。在分析了所有日誌後,IISW3C 輸入格式會將每個日誌文件的當前大小保存到“MyCheckpoint.lpc”文件。

當您稍後運行相同的命令時,IISW3C 輸入格式將從上次分析結束的地方,開始加載檢查點文件,並分析日誌,從而僅處理、篩選和上載新的日誌條目。完成後,將針對日誌文件的新大小更新檢查點文件,隨後這個過程將再次循環。

假如認真理解了本文開頭處的設計說明,那麼您可能已經知道:只需更改輸入格式,您就重複使用該命令,將 Log Parser 輸入格式支持的 任何 日誌上載到數據庫。想要上載事件日誌條目嗎?只需使用 EVT 輸入格式,具體如下:

C:/Logs>logparser "SELECT * INTO EventLogsTable FROM System" –i:EVT –o:SQL – database:LogsDatabase –iCheckpoint:MyCheckpoint.lpc

創建報表

至此,您應該已經知道:通過選擇正確的輸入格式並編寫正確的查詢,就可以從日誌文件、系統或 Log Parser 支持的任何對象,獲得所需的任何信息。

不過,我們只看到有關命令將信息返回到控制檯窗口,或者將記錄上載到 SQL 數據庫。假如您正在使用 Log Parser,爲您的管理團隊生成報表,那麼您可能需要某種比 SQL 表更人性化的東西,不是嗎?

生成 HTML 頁

在這個例子中,假設我們要生成一個報表,使之包含一臺特定的遠程計算機(將在該計算機的安全事件日誌中檢索)上的所有登錄信息:

C:/>logparser "SELECT ComputerName, TimeGenerated AS LogonTime, STRCAT(STRCAT(EXTRACT_TOKEN (Strings, 1, '|'), '//'), EXTRACT_TOKEN(Strings, 0, '|')) AS Username FROM //SERVER01 /Security WHERE EventID IN (552; 528) AND EventCategoryName = 'Logon/Logoff'" -i:EVT

不要被該查詢嚇倒——其表面上的複雜性大多是因爲我們爲了從事件數據中提取完整的 <doman>/<username> 字符串,而執行的一些字符串操作造成的。

若使用 NAT 輸出格式,具體的輸出結果如下所示:

ComputerName LogonTime           Username ------------ ------------------- ---------------------------- SERVER01     2004-06-24 09:47:12 NT AUTHORITY/NETWORK SERVICE SERVER01     2004-06-24 09:48:05 SERVERDC/Administrator SERVER01     2004-06-24 09:48:05 NT AUTHORITY/NETWORK SERVICE SERVER01     2004-06-24 10:00:59 NT AUTHORITY/NETWORK SERVICE SERVER01     2004-06-24 10:01:00 NT AUTHORITY/LOCAL SERVICE SERVER01     2004-06-24 10:01:06 SERVER01/Gabriele SERVER01     2004-06-24 10:01:15 NT AUTHORITY/LOCAL SERVICE SERVER01     2004-06-24 10:01:18 SERVERDC/Monica SERVER01     2004-06-24 10:01:18 NT AUTHORITY/LOCAL SERVICE SERVER01     2004-06-24 10:01:24 NT AUTHORITY/LOCAL SERVICE

爲了將該輸出格式化爲 HTML 格式,我們將使用 TPL 輸出格式。該輸出格式把一個參數作爲說明如何格式化輸出的文本文件(“模板”文件)。這裏,我們將編寫該模板文件,將輸出轉化爲 HTML 表,具體如下:

<LPHEADER> <HTML> <HEAD><TITLE>Logon/Logoff Report</TITLE></HEAD> <BODY> <H1>Logon/Logoff Report</H1> <TABLE BGCOLOR="#D0D0E0" BORDER="1" CELLPADDING="10"> <TR> <TH>%FIELDNAME_1%</TH> <TH>%FIELDNAME_2%</TH> <TH>%FIELDNAME_3%</TH> </TR> </LPHEADER>

<LPBODY> <TR> <TD><TT>%FIELD_1%</TT></TD> <TD><TT>%FIELD_2%</TT></TD> <TD><TT>%FIELD_3%</TT></TD> </TR> </LPBODY>

<LPFOOTER> </BODY> </HTML> </LPFOOTER>

我不在這裏深入探討該模板文件的細節——其格式在 Log Parser 的聯機文檔中有非常詳細的說明。請注意,這個模板文件分爲三節(標題、正文和頁腳),每一節都使用了特殊的“%變量%”(在運行時,由來自查詢結果的值進行替換)。

現在,我們就可以通過上述命令,使用 TPL 輸出格式,生成報表了:

C:/>logparser "SELECT ComputerName, TimeGenerated AS LogonTime, STRCAT(STRCAT(EXTRACT_TOKEN (Strings, 1, '|'), '//'), EXTRACT_TOKEN(Strings, 0, '|')) AS Username INTO Report.html FROM //SERVER01/Security WHERE EventID IN (552; 528) AND EventCategoryName = 'Logon/Logoff'" - i:EVT –o:TPL –tpl:MyTemplate.txt

該命令將生成一個“Report.html”文件,並在瀏覽器中打開,具體如“圖 1”所示。

Figure 1: Report generated by using the TPL output format

圖 1:使用 TPL 輸出格式生成的報表

生成圖表

在最後一個例子中,我將向您展示如何在不使用 Excel 的情況下,直接從查詢結果生成圖表。

以下命令可計算出 IIS 日誌文件每小時的命中總數,具體方法是:使用 CHART 輸出格式,創建一個包含圖表的 JPG 圖像:

C:/>logparser "SELECT TO_STRING(time, 'HH') AS Hour, COUNT(*) AS Hits INTO MyChart.jpg FROM ex*.log GROUP BY Hour ORDER BY Hour ASC" -i:IISW3C -o:CHART -chartType:ColumnClustered - chartTitle:"Hourly Hits" -groupSize:420x280

具體輸出如“圖 2”所示。

Figure 2: Chart Output of Hourly Hits

圖 2:顯示每小時命中數的圖表輸出

總結

我們已經看到 Log Parser 體系結構可實現大量應用方案,而這都是通過 Log Parser 靈活的“數據處理管道”實現的。我向您介紹了可以使用 Log Parser 搜索數據,將日誌上載到 SQL 數據庫,並生成報表,而這只是該工具常規應用方案的三個例子。

我在前面說過,很難用一句話來概括 Log Parser 的用戶,我可不是在騙你——不是嗎?

更多信息

請參考下列資源:

http://www.logparser.com: 該站點(由 Mike Gunderloy 所有並維護)稱爲“非官方的 Log Parser 支持站點”,提供了一個公共論壇,供用戶進行答疑,交流使用技巧,以及彙報問題。此站點還提供了一個知識庫來解答一些常見問題,並列出了網上其他有關 Log Parser 的文章的大量鏈接。

《Microsoft Log Parser 工具包》 一書包含本人以及其它衆多 Log Parser 用戶所提供的信息和腳本。該書介紹了有關此工具的使用技巧和竅門,可幫助用戶充分挖掘 Log Parser 的潛能。

腳本的故事: 本文摘自 TechNet 的 腳本專家 專欄,介紹瞭如何通過編程方式使用 Log Parser 可編腳本的 COM 對象,如何在腳本中選擇輸入和輸出格式,如何設置屬性,以及如何使用 Log Parser 查詢生成的記錄。

發佈了23 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章