Поиск в файле журнала по шаблону, а затем обратный поиск определенного текста - PullRequest
0 голосов
/ 23 января 2019

Я читаю файл журнала, который выглядит следующим образом:

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 с Get-Content .\JSON.log | ? {($_ | Select-String “Error”)}, однако для отчета по электронной почте я хочуподготовить, мне нужна строка с соответствующим Import # , который предшествовал ей.Я не могу использовать -context, поскольку строки между ошибкой и строкой номера импорта колеблются.

Можно ли искать в журнале, найти строку, а затем искать другую строку в обратном направлении?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Если вы фильтруете журнал, чтобы показать только строки, которые соответствуют «ОШИБКА» или «Импорт №», то вы можете использовать индекс строки ОШИБКА, чтобы получить предыдущую строку.Эта строка должна быть строкой импорта, поскольку мы фильтруем журнал только для отображения импорта и ошибок.

Предположение основано на отправленном вами журнале.Возможно, это может не сработать, если журнал содержит другие строки, соответствующие этим шаблонам, которые не относятся к нашему поиску.

# 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]
    }
}
0 голосов
/ 23 января 2019

Вы можете сделать это (лучшая производительность):

.\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 = $_
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...