私は、負荷分散された Web サーバーをいくつか持つ会社で働いています。すべての IIS サーバーに対して実行し、500 エラー エントリを取得してからクライアントの IP アドレスを取得する PowerShell スクリプトを作成し、そのクライアントの IP アドレスが原因で 500 エラーが発生した回数を表示します (はい、私はこれには LogParser を使用できることはわかっていますが、基本的な PowerShell スキルを習得するための言い訳でした)。
現在、出力には Web サーバー名、カウント、および IP アドレスが表示されています。理想的には、カウントですべての Web サーバーのカウントを集計し、IP アドレスを表示したいと考えています。実際の出力と目的の出力の両方を含む以下のコードを含めました。
$source = "WebServer"
$destination = "LogServer01"
$date = "190122"
if (Test-Path \\$destination\Drive$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt) {
Remove-Item \\$destination\Drive$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt
}
for ($i = 1; $i -lt 13; $i++) {
if ($i -lt 10) {
$serverName = "$($source)0$($i)"
} else {
$serverName = "$($source)$($i)"
}
# Grabbing the logs
Get-Content -Path \\$serverName\D$\LogFiles\WebSite\W3SVC20000\"u_ex$($date)*.log" |
Where-Object { $_.Contains(" 500")} |
ForEach-Object { $_.Split(" ")[15] } |
Group-Object |
Where-Object { $_.Count -gt 1 } |
Where-Object { $_.Name -ne "-" } |
Sort-Object Count -Descending |
Format-Table Count, Name >> \\$destination\D$\Temp\LogFiles\IISLogs\"IISLogs-for-$($date)".txt
};
望ましい出力:
カウント名 17 186.0.25.8 15 202.58.5.16 12 96.58.1.58
実際の出力:
Webserver01 カウント名 5 186.0.25.8 3 202.58.5.16 2 96.58.1.58 Webserver02 カウント名 4 186.0.25.8 2 202.58.5.16 1 96.58.1.58 Webserver03 カウント名 4 186.0.25.8 1 202.58.5.16 2 96.58.1.58