我正在读取如下所示的日志文件:
[ { "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”)}
,因为错误和导入数字行之间的线是波动的。
是否可以搜索日志,找到字符串,然后向后搜索另一个字符串?
答案 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]
}
}