我在一家公司工作,该公司拥有一些负载平衡的web服务器。我已经创建了一个PowerShell脚本,该脚本针对我们所有的IIS服务器,提取500个错误条目,然后提取客户端的IP地址,并向我显示该客户端IP地址导致500个错误的次数(是的,我知道我们可以使用LogParser,但这是帮助学习一些基本PowerShell技能的借口)。
现在,我的输出显示了web服务器名称、计数和IP地址。理想情况下,我希望计数聚合所有web服务器的计数,并显示IP地址。我已经包含了下面的代码,包括实际输出和所需输出。
$source = "WebServer"
$destination = "LogServer01"
$date = "190122"
if (Test-Path \$destinationDrive$TempLogFilesIISLogs"IISLogs-for-$($date)".txt) {
Remove-Item \$destinationDrive$TempLogFilesIISLogs"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 \$serverNameD$LogFilesWebSiteW3SVC20000"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 >> \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt
};
期望输出:
计数名称17 186.0.25.815 202.58.5.1612 96.58.1.58
实际输出:
Webserver01计数名称5 186.0.25.83 202.58.5.162 96.58.1.58Webserver02计数名称4 186.0.25.82 202.58.5.161 96.58.1.58Webserver03计数名称4 186.0.25.81 202.58.5.162 96.58.1.58
简单方法:添加服务器名称作为计算属性:
... |
Group-Object -NoElement |
Select-Object @{n='ServerName';e={$serverName}}, Count, Name |
...
不过,这并不能给您提供所需的输出。相反,你会得到:
ServerName计数名称-------------------Web服务器01 5 186.0.25.8Web服务器01 3 202.58.5.16Web服务器01 2 96.58.1.58Web服务器02 4 186.0.25.8Web服务器02 2 202.58.5.16Web服务器02 1 96.58.1.58Web服务器03 4 186.0.25.8Web服务器03 1 202.58.5.16Webserver03 2 96.58.1.58
但是,我认为这种格式更可取,因为通过用Export-Csv
替换Format-Table ... >> ...
,您可以以其他应用程序可以轻松读取的格式导出数据。
如果您想要与问题中完全相同的输出,则需要创建自定义输出,例如通过格式运算符(-f
)。
$data = Get-Content -Path ... |
...
Sort-Object Count -Descending
'{0,-15} Count Name' -f $serverName | Set-Content 'C:output.txt'
$data | ForEach-Object {
'{0,-15} {1,-5} {2}' -f '', $_.Count, $_.Name
} | Add-Content 'C:output.txt'
这是我想出的解决方案,我所要做的就是向Format Table cmdlet中添加一个-Group By"Name"并将-Property设置为"Count",这是我为感兴趣的人编写的代码:
$source = "Webserver"
$destination = "LogServer01"
$date = "190122"
if (Test-Path \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt) {
Remove-Item \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt
}
for($i = 1; $i -lt 13; $i++)
{if ($i -lt 10)
{
$serverName = "$($source)0$($i)"
}
else {
$serverName = "$($source)$($i)"
}
Get-Content -Path \$serverNameD$LogFilesWebSiteW3SVC20000"u_ex$($date)*.log" |
Where-Object { $_.Contains(" 500")} |
ForEach-Object {$_.split(" ")[15]} |
Group-Object | ## Grouping the data by name column (IP Address)
Where-Object {$_.Count -gt 1} |
Where-Object {$_.Name -ne "-"} |
Sort-Object Count -Descending |
Format-Table -GroupBy Name -Property Count >> \$destinationD$TempLogFilesIISLogs"IISLogs-for-$($date)".txt
};