使用 PowerShell 查詢 IIS Log 路徑
| | 4 | | ![]() |
今天被問了一個問題:「如何快速查詢 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,踏破鐵鞋,原來這裡就有,謝謝分享,已補充於本文。