【发布时间】:2017-03-24 22:31:41
【问题描述】:
我想创建一个脚本,将 logparser 包装到 Powershell 中并自动分析一组日志。我将为许多常见的分析任务创建一个函数。我遇到的问题是我有一个单独的复制脚本,它将转到许多服务器,并修改将文件转储到一个位置的名称。我将日志文件夹名称和服务器名称附加到文件中。因此,如果我在一台服务器上有两个站点而不是 u_ex160415.log,我将拥有 NYVPRDWEB2_W3SVC1_u_ex160415.log 和 NYVPRDWEB2_W3SVC2_u_ex160415.log。我最终得到了一个文件夹,里面可能有 50 条日志需要解析,正如你可以想象的那样,文件名变化很大。
当我使用通配符对日志运行 logparser 查询时,我总是收到错误消息
logparser "SELECT * FROM C:\Logs\*.log WHERE sc-status <> 200"
返回的错误是:
logparser:错误:WHERE 子句:语法错误:未知字段“sc-status”
根据过去的经验,我知道这是通配符,所以我没有使用 *.log
logparser "SELECT * FROM C:\Logs\NYVPRDWEB2_W3SVC1_u_ex160415.log,C:\Logs\NYVPRDWEB2_W3SVC2_u_ex160415.log WHERE sc-status <> 200"
这很好,所以我想我只需编写脚本,将所有文件名附加到一个字符串中,我将传递给 logparser 查询。我试过这个:
function Get-IISErrors([Parameter(Mandatory=$true)]$LogPath,[Parameter(Mandatory=$true)]$OutputDestination,[datetime]$StartDate,[datetime]$EndDate,$DaysBack)
{
#Validate Parameters
if ($LogPath -eq '')
{
Write-Host -ForegroundColor Red "Log Path is a required parameter"
}
if ($OutputDestination -eq '')
{
Write-Host -ForegroundColor Red "Output Destination is a required parameter"
}
#Get names of Files that will be analyzed
$LogName = (Get-ChildItem $LogPath).Name
#Create String of comma separated files to be analyzed
$LogFileString = ""
foreach($x in $LogName)
{
$LogFileString = $LogFileString + "'" + $LogPath + $x + "'" + ","
}
$LastIndex = $LogFileString.Length -1
$LogFileString = $LogFileString.Substring(0,$LastIndex)
logparser "SELECT * INTO $OutputDestination FROM $LogFileString WHERE sc-status <> 200"
}
但是当我对大量文件运行它时,我得到了
“LogParser.exe”运行失败:文件名或扩展名太长
我宁愿使用 Long Parser 通配符来解决这个问题,有人幸运地使用 *.log 吗?我最终经常使用第三方工具 LogLizard,所以在 LogParser 中的语法方面我有点缺乏经验。
【问题讨论】:
-
你试过
logparser -i:IISW3C "SELECT * FROM C:\Logs\*.log WHERE sc-status <> 200" -
wmz 是正确的 - 你得到“未知字段'sc-status'”的原因是因为你让 LogParser 根据它在 FROM 子句中看到的日志猜测字段。如果您明确指定输入格式 - 例如使用 -i:IISW3C - 该错误应该消失。然后,您应该能够使用通配符。还要确保您的通配符不会拾取无关日志,尝试更具体,例如“_u_ex.log”。
标签: powershell logparser