iT邦幫忙

2022 iThome 鐵人賽

DAY 24
1
自我挑戰組

30天 IIS 面面觀系列 第 24

Day24. 凡走過必留下痕跡 - Logging, IIS Log

  • 分享至 

  • xImage
  •  

終於來到除錯和 Log 相關的單元了,在來到結束大致上我會把 IIS 相關的 Log 與工具做個簡單的介紹,這些都會是你除錯時需要線索的好來源。我不知道是先有雞還是先有蛋,但我知道沒有設定 Log 肯定不會有 Log files。

在你遇到問題不能復現,又必須要找到 Root cause 的時候,你肯定會想有個月光寶盒可以回到過去去把 Log 設定開起來。雖然我沒有月光寶盒,但是我可以在現在先帶大家看一下其中一個 Log 的設定,這樣大家就可以未雨綢繆,確保問題發生的時候,有更多機會能夠追本溯源。

今天要分享的 Log 是 IIS Log,設定位於以下位置:

https://ithelp.ithome.com.tw/upload/images/20221007/20142057H6gOKXebm5.png

點開後會長這樣

https://ithelp.ithome.com.tw/upload/images/20221007/20142057EeLP3Osvzg.png

右邊的 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 拆開,不要造成自己處理資料的麻煩。

https://ithelp.ithome.com.tw/upload/images/20221007/20142057OInwFiM8kc.png

Log File 區域可以選擇產出 Log 檔案的格式,共有 IIS、NCSA、W3C、Custom 四種。簡單介紹一下個別的差異:

  • IIS - 無法客製、固定格式的格式,儲存資訊量比 NCSA 再多一些,
  • NCSA - 全寫為 National Center for Supercomputing Applications,固定格式,會儲存最基本的資訊
  • W3C - 一般情況都會用這個,也是預設的 Log 格式,具彈性可設定需要欄位
  • Custom - 如果上面都不符合你的需求,你可以用自己的方式來決定寫 Log 的方式,你會需要依照規範自己實作收到對應 Request 的行為,如果決定用這個方式可以到這裡參考更多,不過我想決定要用這個方式的人應該很清楚自己要做什麼

https://ithelp.ithome.com.tw/upload/images/20221007/20142057eTv9UHZBX5.png

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 可以從這裡簡單的查看:

https://ithelp.ithome.com.tw/upload/images/20221007/20142057vlEOwwLxqM.png

https://ithelp.ithome.com.tw/upload/images/20221007/201420571lL0lLYCrp.png

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 是文字檔,你用文字編輯器打開大概會像這樣子:

https://ithelp.ithome.com.tw/upload/images/20221007/20142057scPvq1uv4W.png

直接文字編輯器打開的話正常是不利於閱讀與分析,Microsoft 有提供兩種解法,一是命令列的 Log Parser,二是圖形化介面的 Log Parser Studio。命令列效能通常會比圖形介面好些,如果 Log 檔案真的極端的大,那就乖乖用命令列吧,但平時我個人是喜歡用 Log Parser Studio,簡稱 LPS 。

簡單的示範一下如何使用 LPS 來查看 IIS Log:

https://ithelp.ithome.com.tw/upload/images/20221007/20142057smykdCN5WJ.png

https://ithelp.ithome.com.tw/upload/images/20221007/20142057WJP0FoYkqd.png

關於 Log 的檔案來源,LOGFILEPATH 指的是你點擊上面資料夾載入的 Log File Manager 裡的所有檔案,如果你有大量的 Log 要一次分析,可以使用這個方式。也可以直接替換為實體路徑,比如你要掃某個資料夾底下的 Log,你可以這樣做 ‘C:/This/Is/My/Log/Folder/*.log’。

在查詢的時需對 SQL 語言有些認識,需透過撰寫 SQL 查詢語句來查詢,匯入的 Log 檔案就好像變成了你的資料庫中的一張表一樣。

https://ithelp.ithome.com.tw/upload/images/20221007/20142057mfj3UF2P7r.png

查詢前記得依 Log 選擇格式,寫完 Query 語句後就按下紅色驚嘆號即可查詢。查詢的結果會像上圖一樣呈現在視窗中間,比如預設的 Query 是 Top 10,這裡就顯示了前 10 筆 Log 資訊。

關於IIS log的基礎大概就是這樣,如果完賽有空我會再回來分享一些我個人常用的 query。基本要找人家寫好的片段的話可以下 IIS log、example、你的目的之類的,通常你會有個基本樣板可以改,不一定要自己從頭寫。


上一篇
Day23. 比24更好笑的笑話 - Http error and related instruction
下一篇
Day25. 企事減見是,事件檢視器 - Event Viewer
系列文
30天 IIS 面面觀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言