﻿# 介紹好用工具：Log Parser (分析多種 Log 格式的超強工具)

[Log Parser](https://www.microsoft.com/en-us/download/details.aspx?id=24659) 大概是我兩、三年前得知的一套工具，因為當初我們正在進行一個專案的開發，該專案所收集的 Log 量十分龐大，每分鐘最大產出量為 4 萬筆紀錄，當我正一籌莫展的時候，我的一個好友小昌介紹給我這套鮮為人知的 [Log Parser](https://www.microsoft.com/en-us/download/details.aspx?id=24659) (其實是我孤陋寡聞)，我可說是目瞪口呆，除了 [Log Parser](https://www.microsoft.com/en-us/download/details.aspx?id=24659) 的分析效率極高之外（印象中好像每分鐘可以分析完好幾百 MB 的純文字紀錄檔），還提供一組類似 SQL 語法的查詢機制，可以非常彈性的讓你選取 Log 檔中的欄位 (SELECT)、群組 (GROUPING) 或篩選 (WHERE) 資料，就像是在使用資料庫一樣。

![log-parser-2 2](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/158902b908cda6e31363-cfe578e5-8139-4cac-bc15-21bf9da70752.webp)

目前最新的版本為 [Log Parser 2.2](https://www.microsoft.com/en-us/download/details.aspx?id=24659)，下載後從「程式集」中可以找到 Log Parser 2.2 的蹤跡，如下圖：

![Log Parser 2.2](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/93250d1bd724a09bc96d-image_3.png "Log Parser 2.2")

點選 Log Parser 2.2 之後，就會開啟一個「命令提示字元」的視窗，而要學會 Log Parser 要如何操作，最快的方式就是先看範例啦，各位可以打以下指令列出許多 Log Parser 的指令用法範例，相信有經驗的人光是看範例就有「感覺」要怎麼用了：

```bash
logparser -h EXAMPLE |more
```

我舉幾個例子說明好了：

1.  之前我寫 [BlogEngine 1.3.0.0 出現嚴重安全性漏洞](/post/2008/04/15/BlogEngine-Security-Vulnerability-in-BE-Javascript-handler)文章的時候其實就有提供一個簡單的範例了，以下這行指令就是分析目前工作目錄下所有 \*.log 檔案為資料來源 (FROM)，並選取出該檔案中的 date, time, cs-uri-stem, cs-uri-query, c-ip, cs (User-Agent) 這些欄位，並透過 -i 參數來指定「輸入資料的格式」為 W3C 格式（詳細的格式定義在 Log Parser 2.2 Documentation 中都有詳細說明），-o 是指令輸出的格式為 CSV 格式。
    
    ```bash
    LogParser "SELECT date, time, cs-uri-stem, cs-uri-query, c-ip, cs(User-Agent) FROM \*.log
    WHERE cs-uri-stem like '%js.axd%' and cs-uri-query like '%users.xml%'" -i:W3C -o:CSV
    ```
    
2.  找出 C:\\\*.\* 中所有檔案（含子目錄），並列出檔案體積最大的前 10 名。
    
    ```bash
    LogParser "SELECT TOP 10 Path,Name,Size FROM C:\\\*.\* ORDER BY Size DESC" -i:FS
    ```
    
3.  以上面的例子來說，甚至於 Log Parser 還可以將結果輸出成「圖表」格式，我將以第 2 個例子改成以下這樣，就可以輸出一個名為 Pie.gif 且大小為 590x400 的 Column3D 圖表！
    
    ```bash
    LogParser "SELECT TOP 10 Name,Size INTO Pie.gif FROM C:\\Going32\\\*.\* ORDER BY Size DESC"
    -i:FS -o:CHART -chartType:Column3D -groupSize:590x400
    ```
    

產生後的圖形長這樣：

![Log Parser 輸出的 Column3D 圖表範例](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6654a7a6b106e9ac036c-Pie_3.gif "Log Parser 輸出的 Column3D 圖表範例")

夠強吧！

> 特別注意：若要讓 Log Parser 能夠輸出圖表，必須先安裝 [Office XP Tool: Web Components](https://download.cnet.com/microsoft-office-xp-web-components/3000-2206_4-10750284.html) 才能用。

除此之外，我覺得初學者比較容易遇到的問題是「當我在下 SELECT 的時候，我怎麼知道我的 FROM 來源資料有哪些可用的欄位呢？」，其實這問題很容易解決，你只要先下一次 `SELECT TOP 1 * FROM xxxx` 就可以先取得所有的欄位了，你可以再依據你查到的欄位改寫你的 SQL 查詢語法即可。如下範例：

```bash
LogParser "SELECT TOP 1 \* FROM C:\\Going32\\\*.\* ORDER BY Size DESC" -i:FS > a.txt
```

相信連初學者也會有概念了，剩下的各位就認真看 Log Parser 2.2 Documentation 文件吧。

### 相關連結

-   [Log Parser 2.2 Download](https://www.microsoft.com/en-us/download/details.aspx?id=24659)
-   [Log Parser 2.2 and ASP.NET](https://support.microsoft.com/en-gb/topic/log-parser-2-2-and-asp-net-37531636-1cf5-dc52-f12a-6a9252155631?WT.mc_id=DT-MVP-4015686)
-   [IIS Log File Formats](https://learn.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms525807\(v=vs.90\)?WT.mc_id=DT-MVP-4015686)
-   [Data Mining UrlScan 3.0 Logs using LogParser 2.2](https://blogs.iis.net/robert_mcmurray/data-mining-urlscan-3-0-logs-using-logparser-2-2/)
-   [logparser - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Logparser)
-   [Log Parser Rocks! More than 50 Examples!](https://mlichtenberg.wordpress.com/2011/02/03/log-parser-rocks-more-than-50-examples/)
