Log Parser 工具在手 紀錄我有 | IIS W3C Logs 分析指南

2022-01-11

說明如何使用 Log Parser 進行 IIS Logs 的分析,讓生活變得容易 (Make your life easier)。

logo

說明

Installation & Usage

前往 Microsoft 進行下載,下載後不斷下一步就可以安裝完成。

Log Parser 為 CLI Tool,必須先切換到應用程式的路徑使用。

cd "C:\Program Files (x86)\Log Parser 2.2"

Example Codes

不要問,問就是直接執行的 Quick Script 😃

cd "C:\Program Files (x86)\Log Parser 2.2"

logparser -i:IISW3C -rtp:-1 
	"SELECT date,time,cs-uri-stem,cs-method,cs-username,c-ip,sc-status
		FROM c:\users\*.log
		WHERE cs-uri-stem like '%ApplicationName%'"

LogParser.exe -i:IISW3C "SELECT * into C:\Temp\IISLog.csv FROM C:\Temp\*.log" -o:csv
LogParser.exe -i:IISW3C "SELECT * into IISLogTable FROM C:\Temp\*.log" 
  -o:SQL  -server:servrName -database:dbName 
  -CreateTable:On -transactionRowCount:-1

使用 transactionRowCount 可以避免每筆資料寫入都建立一個 TCP 連線,而是使用單一 TCP 批次將資料寫入資料庫,對於寫入效能的改善上有所幫助。

如果要將資料匯出到 SQL Server 上面,Log Parser 的表現不盡理想,尤其是和 Bulk Insert 以及 BCP 相比,但簡易的使用情境可以使用,如果是複雜的 IIS Logs To SQL Server 則應該另行設計流程,結合使用 Bulk Insert 或者是 BCP。

來些查詢資料的使用範例 🍨

根據 sc-win32-status 的狀態碼處理發生問題的 IIS Reuqests。

SELECT Distinct sc-status, sc-win32-status 
FROM C:\Temp\*.log 
WHERE sc-win32-status <> 0
LogParser.exe -i:IISW3C -rtp:-1 "SELECT Distinct sc-status, sc-win32-status FROM C:\Temp\*.log WHERE sc-win32-status <> 0" 

使用 -rtp:-1 參數,可以避免預設每 10 筆按任意按鍵進行換頁的功能,讓資料可以一次全部顯示,非常方便。

IIS Logs

IIS Logs Default Column

Column Name Meaning
date 日期 UTC
time 時間 UTC
s-ip 伺服器 IP
cs-method HTTP Method (GET, POST)
cs-uri-stem URI 相對路徑
cs-uri-query URI 參數
s-port 伺服器 Port
cs-username 使用者名稱
c-ip 使用者 IP
cs(User-Agent) 瀏覽器、作業系統資訊
cs(Referer) 來源位址
sc-status Http Status
sc-substatus
sc-win32-status 顯示各種錯誤狀態的代碼,0 表示為正常
time-taken Byte 傳送時間,單位為 ms,1000 為 1 秒

Win32 Status Error Code

Log Parser Cretae IIS Log Table

下列為使用 Log Parser 匯出到 SQL Server 時會自動建立 Table 的 Schema。

CREATE TABLE [dbo].[IISLog](
	[LogFilename] [varchar](255) NULL,
	[LogRow] [int] NULL,
	[date] [datetime] NULL,
	[time] [datetime] NULL,
	[cIp] [varchar](255) NULL,
	[csUsername] [varchar](255) NULL,
	[sSitename] [varchar](255) NULL,
	[sComputername] [varchar](255) NULL,
	[sIp] [varchar](255) NULL,
	[sPort] [int] NULL,
	[csMethod] [varchar](255) NULL,
	[csUriStem] [varchar](255) NULL,
	[csUriQuery] [varchar](255) NULL,
	[scStatus] [int] NULL,
	[scSubstatus] [int] NULL,
	[scWin32Status] [int] NULL,
	[scBytes] [int] NULL,
	[csBytes] [int] NULL,
	[timeTaken] [int] NULL,
	[csVersion] [varchar](255) NULL,
	[csHost] [varchar](255) NULL,
	[csUserAgent] [varchar](255) NULL,
	[csCookie] [varchar](255) NULL,
	[csReferer] [varchar](255) NULL,
	[sEvent] [varchar](255) NULL,
	[sProcessType] [varchar](255) NULL,
	[sUserTime] [real] NULL,
	[sKernelTime] [real] NULL,
	[sPageFaults] [int] NULL,
	[sTotalProcs] [int] NULL,
	[sActiveProcs] [int] NULL,
	[sStoppedProcs] [int] NULL
) ON [PRIMARY]
GO

小結

Log Parser 不僅可以應用於 IIS Logs 上,對於 Text file 以及其他類型的 Log 處理一樣拿手,不需要自己 DRY 爬檔案,使用 Log Parser 進行探索即可。

愛藏使用 Log Parser Script

確認 IIS Logs Http Status 分布情形

LogParser.exe -i:IISW3C -rtp:-1 "SELECT sc-status, count(*) FROM C:\Temp\*.log group by sc-status"

確認前 100 筆,最費時的查詢

LogParser.exe -i:IISW3C -rtp:-1 "SELECT TOP 100 c-ip, date, time, time-taken, sc-status FROM C:\Temp\*.log ORDER BY time-taken DESC"

確認前 100 筆連線次數最多的 IP

LogParser.exe -i:IISW3C -rtp:-1 "SELECT TOP 100 c-ip, count(*) FROM C:\Temp\*.log GROUP BY c-ip ORDER BY count(*) DESC"

參考資料

LogParser Performance Inserting into SQL Server

使用 Log Parser 將 IIS LOG 轉入 SQL 2005 Express

Log Parser Rocks! More than 50 Examples!

相關連結

使用 SQL Server 匯入 IIS Logs 進行分析

IIS 筆記整理

IIS 網頁伺服器的安全設定 (IIS Security Configuration)