Назад | Перейти на главную страницу

Подсчитать количество совпадений с шаблоном в файле журнала в реальном времени за определенный период времени с помощью PowerShell?

Я должен перехватить шаблон в файле журнала и, когда этот шаблон будет сопоставлен 5 раз за 5 минут, отправить предупреждение ...

Я написал эти строки, но я застрял ... Я не знаю, как управлять временными рамками ...

Не могли бы вы мне помочь?

Роберто.

$count = get-content test.txt -Tail 1 -Wait | select-string -pattern "auth" -simplematch
$count.length

Я пробовал другой подход, но делать нечего ...

$file = "test.txt"
$mymatch = "auth"
#$FirstEventTime = Get-Date
#$LastEventTime = Get-Date
$Err = 0
$Range =@(1,2,3,4)
$Tailfile = Get-Content $file -Tail 1 -Wait | select-string -pattern $mymatch -simplematch | foreach ($mymatch) {
    if($Err -lt 1){
        New-Event -SourceIdentifier StartEvent -Sender windows.timer
        $Err++
        }
    #elseif ($Err -eq [1-4])
    elseif ($Range -contains $Err){
        $Err++ }
    else {
        New-Event -SourceIdentifier LastEvent -Sender windows.timer
        $FisrtEvent = (get-event StartEvent).TimeGenerated
        $LastEvent = (get-event LastEvent).TimeGenerated
        $Elapsed = $LastEvent-$FisrtEvent
        $realElasped = ($elapsed).TotalMinutes
        [math]::Round($realElasped)

            if ($realElasped -lt 5) {
                echo "sendmail......"
                $Err = 0}
            else {
            $Err = 0
                }
            }
        } 

Для тех, у кого такая же потребность, я исправил свой сценарий, и теперь он работает!

$MailArgs = @{
    From = bla, bla, bla....
}

$file = "Test.txt"
$FolderLogs = "E:\TMP"
$mymatch1 = "autentica"
$mymatch2 = "WS ERROR"
$Err = 0
$Range =@(1,2,3,4)
$Tailfile = Get-Content $file -Tail 1 -Wait | ?{ $_ -match $mymatch1 -and $_ -match $mymatch2 } | ForEach-Object {
    if($Err -lt 1){
        New-Event -SourceIdentifier StartEvent -Sender windows.timer
        $Err++
    }
    elseif ($Range -contains $Err) {
        $Err++ 
    }
    else {
        New-Event -SourceIdentifier LastEvent -Sender windows.timer
        $FisrtEvent = (get-event StartEvent).TimeGenerated
        $LastEvent = (get-event LastEvent).TimeGenerated
        $Elapsed = $LastEvent-$FisrtEvent
        $realElasped = ($elapsed).TotalMinutes
        [math]::Round($realElasped)

        if ($realElasped -lt 5) {
            Send-MailMessage @MailArgs 2>&1 > $FolderLogs\MailLogs.txt
            $Err = 0
        }
        else {
            $Err = 0
        }
    }
}

Количество вхождений в интервал - это полезное условие для предупреждения, но это нетривиальная программа для написания. В большинстве простых хвостовых реализаций такой возможности нет.

Рассмотрите возможность внедрения системы агрегирования журналов с расширяемыми условиями оповещения. Например, Graylog получает X сообщений за Y минут. Да, это гораздо более масштабный проект, чем ведение одного журнала. Однако он также может принимать журнал событий и системный журнал и делать аналогичные вещи для любого события с любого хоста.