今天被問了一個問題:「如何快速查詢 IIS 特定站台的 Log 路徑?」

還不簡單,用 IIS 管理員介面一查就有。

等等,LogFiles 目錄下一堆 W3SVC1、W3SVC2、W3SVC3... 誰是誰?

之前的笨解法是看目錄或檔案時間跟檔案大小,再依各站台流量去猜,再不然就是打開 .log 檔案看 URL,手氣背時猜到第三次才中獎。伺服器多又雜記不住,久久查一次,每次從頭來這麼一趟,說實在還蠻浪費時間的。

難道沒有更簡便的方法?我想到伺服器管理的奧林匹克指定兵器 - PowerShell

PowerShell 有個 Cmdlet Get-WebSite 可以列出 IIS 所有站台資訊(註:需使用管理者權限執行),若想進一步解析每個站台資訊物件的結構,我慣用的做法是將它轉成 JSON:

Get-Website | Select -First 1 | ConvertTo-Json | Out-File "WebSiteModel.json"

查看 JSON 得知 Log 檔的路徑存在 LogFile.Directory 屬性:

用 foreach 搭配 .NET String.Format 並使用左右靠齊格式技巧,一份簡單扼要的站台 Log 路徑對照表瞬間完成,不用再玩猜猜看囉。

完整指令如下。下回需要確認 IIS Log 目錄,開個 PowerShell 視窗,複製貼上立刻有答案:

Get-Website | foreach { [String]::Format("{0,-24} {1}\\W3SVC{2}", $_.Name, $_.LogFile.Directory, $_.Id) }

【同場加映】如果要查 AppPool 的 ProcessId 呢?

dir IIS:\AppPools 可列出所有 AppPool,dir IIS:\AppPools\AppPoolName\WorkerProcesses 則能查到指定 AppPool 的 PID:

我想讓資訊更精簡一點,用前面說的轉 JSON 技巧剖析資料物件的結構,得知 Process 資料放在 Collection 陣列:

用 where 篩選有包含 Process 項目的 Collection,印出 AppPool 名稱、PID、狀態:

dir IIS:\AppPools | where { $_.WorkerProcesses.Collection.Length -gt 0 } | 
foreach { 
    [String]::Format("{0,-16} {1,8} {2,8}", 
        $_.Name, 
        $_.WorkerProcesses.Collection[0].ProcessId, 
        $_.WorkerProcesses.Collection[0].State) 
}

完美。

PowerShell 練習完畢,收工。

2019-11-15 更新:感謝讀者 Eric Lin、Steven Huang、TitanCAT 陸續補充快速查詢 IIS 站台 ID 的技巧,最方便的方法是從站台清單:

若不是用 IIS 預設 Log 資料夾或各機器 IIS Log 位置未統一,還是可考慮用 PowerShell 查詢較簡便。

Examples of using PowerShell to get IIS website's log path and application pool process id.


Comments

# by Steven Huang

另一種方式: 開啟IIS->任何一個站台(Sites)->進階設定(Advanced Settings)->ID 這個 ID 就是對應到 W3SVC 的後面的數字,例如 ID 是10,該站台的 logs 就存放於 W3SVC10 資料夾

# by Jeffrey

to Steven Huang, 感謝分享。

# by TitanCAT

直接點 "站台" 右邊就會列出所有站台,隔壁欄位就是 ID。 一次就可以看到所有站台對應的ID數字了~ 然後就去查 W3SVC+ID 資料夾

# by Jeffrey

to TitanCAT,踏破鐵鞋,原來這裡就有,謝謝分享,已補充於本文。

Post a comment