使用通配符解析大量日志时遇到问题

时间:2017-03-24 22:31:42

标签: powershell logparser

我想创建一个脚本,将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子句:语法错误:未知字段&#39; sc-status&#39;

从过去的经验来看,我知道这是通配符,所以我没有使用* .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"

}

但是当我针对大量文件运行时,我得到了

&#39; LogParser.exe&#39;无法运行:文件名或扩展名太长

我宁愿使用Long Parser外卡来解决这个问题,有没有人只运用* .log?我最终在很多时候都使用第三方工具LogLizard,所以当谈到LogParser中的Syntax时,我有点缺乏经验。

1 个答案:

答案 0 :(得分:0)

我使用以下查询从具有Powershell的驱动器上的所有.evtx文件中找到所有事件id = 4771:

PS C:\ Get-ChildItem -Recurse | where {$_.name -like "*.evtx"} | foreach{ cd $_.DirectoryName; pwd; & 'C:\Program Files(x86)\Log Parser 2.2\LogParser.exe'
-stats:OFF -i:EVT -q:ON "select * from $_. where eventid='4771'" >> out.csv}  

效果很好,我认为如果我更改部分代码可以用于您的问题,

PS C:\ Get-ChildItem -Recurse | where {$_.name -like "*.log"} | foreach{ cd $_.DirectoryName; pwd; & 'C:\Program Files(x86)\Log Parser 2.2\LogParser.exe'
-stats:OFF -i:IISW3C -q:ON "select * from $_. where sc-status <> '200'" >> out.csv}   

最后,您可以使用Microsoft Excel打开.csv文件,并将text to column函数与管道定界符(|)配合使用,以具有可读的格式。