根据模式搜索日志文件,然后反向搜索特定文本

时间:2019-01-23 13:49:11

标签: powershell

我正在读取如下所示的日志文件:

[ { "eventId" : 63, 
    "title" : "test 1", 
    "eventType" : 5, 
    "start" : "2019-01-08", 
    "end" : "2019-01-08", 
    "color" : null, 
    "allDay" : true } ]

我可以轻松找到带有2019-01-22 13:58:01,524 [1] DEBUG BuH.Sync.Json.ImportSet [(null)] - Import #12344453467612341 2019-01-22 13:58:01,735 [1] DEBUG BuH.Sync.Json.ImportSet [(null)] - Log Stuff 2019-01-22 13:58:01,742 [1] DEBUG BuH.Sync.Json.ImportItem [(null)] - Log Stuff 2019-01-22 13:58:01,761 [1] DEBUG BuH.Sync.Json.BusinessObjects.Adresse [(null)] - Log Stuff 2019-01-22 13:58:01,781 [1] INFO BuH.Sync.Json.Mapping.Converter2 [(null)] - Log Stuff 2019-01-22 13:58:01,785 [1] ERROR BuH.Sync.Json.Mapping.Json.JsonAdressConverter [(null)] - LOG SYSTEM ERROR CODE 2019-01-22 13:58:01,894 [1] DEBUG BuH.Sync.Json.ImportSet [(null)] - Import #9546181668418643 2019-01-22 13:58:01,896 [1] DEBUG BuH.Sync.Json.ImportSet [(null)] - Log Stuff 2019-01-22 13:58:01,897 [1] DEBUG BuH.Sync.Json.ImportItem [(null)] - Log Stuff 2019-01-22 13:58:01,902 [1] ERROR BuH.Sync.Json.Mapping.Json.JsonAdressConverter [(null)] - LOG SYSTEM ERROR CODE ERROR 行,但是对于要准备的电子邮件报告,我需要带有相应的 Import#的行>在此之前。我无法使用Get-Content .\JSON.log | ? {($_ | Select-String “Error”)},因为错误和导入数字行之间的线是波动的。

是否可以搜索日志,找到字符串,然后向后搜索另一个字符串?

2 个答案:

答案 0 :(得分:0)

您可以这样做(性能更好):

.\JSON.log | foreach {
    # error record found
    if ($_ -match "Error") {
         Write-Host "Import: $importLine"
         Write-Host "Error: $_"
    }
    # if "Import" occurence found, remember it and continue
    elseif ($_ -match "Import #") {
        $importLine = $_
    }
}

答案 1 :(得分:0)

如果您过滤日志以仅显示与“ ERROR”或“ Import#”匹配的行,则可以使用ERROR行的索引来检索前一行。该行应该是导入行,因为我们仅过滤日志以显示导入和错误。

这是根据您发送的日志做出的假设。如果日志中包含与这些与我们的查询无关的模式匹配的其他行,则可能无法正常工作。

# Get content from log file where line matches 'ERROR' or 'Import #'

$log = gc c:\log.txt | ? { $_ -cmatch 'Import #' -or $_ -cmatch 'ERROR' }

# For each line in log file

foreach($l in $log)
{
    # If it matches ERROR

    if($l -cmatch 'ERROR')
    {
        # Return the previous line

        $log[$log.IndexOf($l)-1]
    }
}