【问题标题】:Trouble parsing through a lot of logs using wildcards使用通配符解析大量日志时遇到问题
【发布时间】: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 &lt;&gt; 200"
  • wmz 是正确的 - 你得到“未知字段'sc-status'”的原因是因为你让 LogParser 根据它在 FROM 子句中看到的日志猜测字段。如果您明确指定输入格式 - 例如使用 -i:IISW3C - 该错误应该消失。然后,您应该能够使用通配符。还要确保您的通配符不会拾取无关日志,尝试更具体,例如“_u_ex.log”。

标签: powershell logparser


【解决方案1】:

我使用以下查询从带有 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 函数来获得可读格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多