Строка выбора с несколькими переменными шаблонами

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

2018-05-22 06:25:35.309 +0200 (Production,S8320,DKMdczmpOXVJtYCSosPS6SfK8kGTSN1E,WwObvwqUw-0AAEnc-XsAAAPR) catalina-exec-12 : ERROR com.tableausoftware.api.webclient.remoting.RemoteCallHandler - Exception raised by call target: User 2027 does not have permissions to view comments for view 13086. (errorCode=1)
com.tableausoftware.domain.exceptions.PermissionDeniedException: User 2027 does not have permissions to view comments for view 13086. (errorCode=1)

Ошибка описана в две строки, поэтому мне нужно отфильтровать ошибку и текущий час, а затем скопировать в файл. Этот код действительно копирует все ошибки, но не только текущего часа.

$hodina = (Get-Date -UFormat "%H").ToString()
$hodina = " " + $hodina +":"
$err = ": ERROR"
$errors = Select-String -Path "D:\..\file.log" -Pattern $hodina, $err -Context 0, 1
echo ($errors).Line >> Errors_file.txt

Поэтому мне было интересно, как поместить несколько переменных в -Pattern, или есть ли другое решение этой проблемы.


person dkrizka    schedule 22.05.2018    source источник
comment
Соответствует ли ... blabla ... какому-либо шаблону, или мы должны предположить, что это может быть что угодно? Поля даты имеют фиксированную ширину? э.и. с использованием ведущих нулей и т. д. - всегда 29 символов? Нам нужно отфильтровать даты либо до select-string, либо с   -  person Matt    schedule 22.05.2018
comment
Возможно, вы захотите рассмотреть возможность анализа даты/времени в объекте datetime, а затем проверить, попадает ли запись журнала в интересующий период.   -  person Jeff Zeitlin    schedule 22.05.2018
comment
Другими словами, нет никакого способа, я получаю плохие линии с фильтрами, которые я использовал, поэтому они в порядке, но я открыт для новых.   -  person dkrizka    schedule 22.05.2018


Ответы (1)


Вот как получить все совпадающие строки:

Get-Content "file.log" | 
    Select-String -Pattern "^(?:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})).* : ERROR (?:(.*))$" |
        ForEach-Object {
            [PsCustomObject]@{
                TimeStamp=(Get-Date $_.Matches.Groups[1].Value)
                LineNumber=$_.LineNumber
                Error=$_.Matches.Groups[2].Value
            }
        }

Это даст вам вывод следующим образом:

TimeStamp           LineNumber Error                                                                                                                                              
---------           ---------- -----                                                                                                                                              
22/05/2018 06:25:35          1 com.tableausoftware.api.webclient.remoting.RemoteCallHandler - Exception raised...
22/05/2018 06:25:35          4 com.tableausoftware.api.webclient.remoting.RemoteCallHandler - Exception raised...
22/05/2018 06:25:35          8 com.tableausoftware.api.webclient.remoting.RemoteCallHandler - Exception raised...
22/05/2018 06:25:35         10 com.tableausoftware.api.webclient.remoting.RemoteCallHandler - Exception raised...

Если вам нужны только элементы, в которых час временной метки соответствует текущему часу, измените код следующим образом:

Get-Content "file.log" | 
    Select-String -Pattern "^(?:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})).* : ERROR (?:(.*))$" |
        ForEach-Object {
            [PsCustomObject]@{
                TimeStamp=(Get-Date $_.Matches.Groups[1].Value)
                LineNumber=$_.LineNumber
                Error=$_.Matches.Groups[2].Value
            }
        } | Where-Object {$_.TimeStamp.Hour -eq (Get-Date).Hour}

Затем вы можете отправить вывод в файл или лучше (если вы планируете манипулировать ими позже в PowerShell), CSV (Export-Csv) или CliXml (Export-CliXml)

person boxdog    schedule 22.05.2018
comment
Спасибо, это то, что я искал, но я не мог заставить PsCustomObject работать. - person dkrizka; 22.05.2018
comment
Вторая строка отсутствует (-context 0,1) Добавьте Context=$_.Context.PostContext[0] к [PSCustomObject] - person ; 22.05.2018