終於來到除錯和 Log 相關的單元了,在來到結束大致上我會把 IIS 相關的 Log 與工具做個簡單的介紹,這些都會是你除錯時需要線索的好來源。我不知道是先有雞還是先有蛋,但我知道沒有設定 Log 肯定不會有 Log files。
在你遇到問題不能復現,又必須要找到 Root cause 的時候,你肯定會想有個月光寶盒可以回到過去去把 Log 設定開起來。雖然我沒有月光寶盒,但是我可以在現在先帶大家看一下其中一個 Log 的設定,這樣大家就可以未雨綢繆,確保問題發生的時候,有更多機會能夠追本溯源。
今天要分享的 Log 是 IIS Log,設定位於以下位置:
點開後會長這樣
右邊的 Action Panel 有著最重要的設定:有沒有開啟,可以看到 Disable 的位置,如果是沒開啟的話會寫是 Enable。建議務必開啟,跟 App Pool 和是分開的 Thread,基本上不直接影響效能,出問題的時候如果連 IIS Log 都沒有,那真的是欲哭無淚的。
IIS Log 是記述什麼樣的內容呢?主要是全部「碰到」 IIS 的 Request。沒錯,注意碰到這個詞,記得在前面 Day7 的圖嗎,那張圖真的很重要,如果在 Kernel mode Http.sys 層面就失敗的 Request,IIS 就不會知道,你就得去查看 HTTPERR Log,位於 C:\Windows\System32\LogFiles\HTTPERR。
也因為 IIS 會記述所有抵達的 Request,紀錄的資訊包含處理時間、來源 IP、 Http Status Code等等等,就算沒有發生問題,也能夠拿做效能的分析,或是異常存取的監控(DDOS、 Injection Attack)。
最上面的 One log file per 設定是在 Server Level 可以選擇,可以選擇全部的 Site 都出在同一個 Log,或是依 Site 個別拆檔,個人經驗是大多情況下都會按 Site 拆開,不要造成自己處理資料的麻煩。
Log File 區域可以選擇產出 Log 檔案的格式,共有 IIS、NCSA、W3C、Custom 四種。簡單介紹一下個別的差異:
W3C 的右邊會有 Select Field 可以做選擇,選擇要記錄哪些欄位,這邊就依個人的需求做設定,能夠被 Log 的基本上是 Request 裡帶的所有訊息。預設中比較常用但沒有的比如 X-Forwarded-For,cs-host 等等欄位,關於欄位的細部說明請參考文檔 W3C Logging - Win32 apps。
Encoding 就看個人需求,有 UTF-8 和 ANSI 兩種供選擇,Directory 是決定該份 Log 要存在哪裡,預設位置為 %SystemDrive%\inetpub\logs\LogFiles,再依各網站的 Site Id 存放於不同資料夾(如果你選擇按網站分 Log,預設也是這個行為),資料夾名稱為 W3SVC[SiteId] / FTPSVC[SiteId],前者是有 http protocol binding 的網站,後者是有 ftp protocol binding 的網站。如果兩個都有,比如 Site Id 4 的網站兩個都有,就會有兩個資料夾存兩種不同協定口的 Log,W3SVC4 和 FTPSVC4。
各網站的 Site Id 可以從這裡簡單的查看:
Log Event Destination 指的是要 Log 哪些類型的 Event, Log file 是本身 IIS 會記錄下來的 IIS Log, ETW event 建議閱讀 ETW 介紹 - 以 Event Tracing Session 為範例 來獲得更全面的說明,簡單的說就是 IIS 本身會提供事件,額外去針對事件做處理紀錄。
Log File Rollover 則是指什麼時候要產生新的 Log file,預設是一天一個,流量大的網站可能一天光單一 Log 檔就到 GB 的單位也不無可能。這個部分基本上會建議依個人網站的流量來做設計。儘管可以選擇定時、最大檔案大小、不產生新檔案,我個人會建議仍用定時產生比較好,比如一個小時一個,做資料分析的時候時間往往是一個重要的軸向,還是那句老話,減少自己處理資料的麻煩。
最下面的小勾勾是儲存檔案名稱的時候要不要用 local time, IIS Log 裡記錄的時區統一是 UTC+0 的時區(我這邊講的 IIS Log 實際上指的是儲存為 W3C 格式的 Log,不同 Format 會儲存的時間時區也不一樣,這個要特別注意),並不會因為你勾選了這個就改變 Log 裡時間的時區,只會影響生成的 Log file 本身的名字。
IIS Log 是文字檔,你用文字編輯器打開大概會像這樣子:
直接文字編輯器打開的話正常是不利於閱讀與分析,Microsoft 有提供兩種解法,一是命令列的 Log Parser,二是圖形化介面的 Log Parser Studio。命令列效能通常會比圖形介面好些,如果 Log 檔案真的極端的大,那就乖乖用命令列吧,但平時我個人是喜歡用 Log Parser Studio,簡稱 LPS 。
簡單的示範一下如何使用 LPS 來查看 IIS Log:
關於 Log 的檔案來源,LOGFILEPATH 指的是你點擊上面資料夾載入的 Log File Manager 裡的所有檔案,如果你有大量的 Log 要一次分析,可以使用這個方式。也可以直接替換為實體路徑,比如你要掃某個資料夾底下的 Log,你可以這樣做 ‘C:/This/Is/My/Log/Folder/*.log’。
在查詢的時需對 SQL 語言有些認識,需透過撰寫 SQL 查詢語句來查詢,匯入的 Log 檔案就好像變成了你的資料庫中的一張表一樣。
查詢前記得依 Log 選擇格式,寫完 Query 語句後就按下紅色驚嘆號即可查詢。查詢的結果會像上圖一樣呈現在視窗中間,比如預設的 Query 是 Top 10,這裡就顯示了前 10 筆 Log 資訊。
關於IIS log的基礎大概就是這樣,如果完賽有空我會再回來分享一些我個人常用的 query。基本要找人家寫好的片段的話可以下 IIS log、example、你的目的之類的,通常你會有個基本樣板可以改,不一定要自己從頭寫。