2014-01-14 1 views
1

Мне нужно создать систему для мониторинга журнала в режиме реального времени и отправить предупреждение, если IP-адрес не является иностранным.Powershell: Хвост журнала и обработка каждой строки

Я бы предпочел использовать powershell (v2, из-за перенастройки сервера), чтобы выполнить это, поскольку у меня есть система, которая обрабатывает журнал предыдущего дня, и я смогу многократно использовать эту функциональность.

Я могу с успехом спрятать файл (используя tail.exe) и выбрать важные строки, но я не могу захватить каждую строку и обработать ее.

Основная суть того, что у меня есть:

tail.exe -f \\server\file.log | where-object {$_ -match "criteria"} 

Когда я пытаюсь трубопровода результаты в Еогеасп, я ничего не получаю.

Любые предложения?

ответ

2

Команда хвоста собирается блокировать трубопровод до тех пор, пока он работает. Одним из вариантов является запуск хвост в качестве фонового задания, и обрабатывать результаты в основном скрипте в бесконечном цикле:

$Job = Start-Job -ScriptBlock { tail.exe -f \\server\file.log } 

While ($true){ 
Recieve-Job $Job | 
Where-Object { $_ -match "criteria" } 
Start-Sleep -Seconds 10 
} 
+0

Это работает. Я могу получить данные из '$ job'. Проблема в том, что работа просто хранит данные. Мне кажется, мне нужно оставить GC/tail сзади и перейти к streamReader. Затем я могу легко обрабатывать каждую строку. – user3195248

+0

... но для тех, кто читает это позади меня, используя powershell v3 и '-tail 1', вы можете легко обрабатывать его по одной линии событий за раз. – user3195248

+0

Конечным решением было использование потока. '$ sr = new-object System.IO.StreamReader (новый объект System.IO.FileStream (« $ filename »,« open »,« Read »,« ReadWrite »)). – user3195248

-1

Просто используйте Cmndlet PowerShell Get-Content, и он вернет объект System.Array.

$Content = Get-Content "Path to log.log" | ? { $_ -match "something" } 
+0

'tail -f'" следует за файлом, поскольку к нему добавляются дополнительные данные. 'Get-Content' может сделать это с параметром' -Wait', но это не было введено перед PowerShell v3, а OP ограничено v2. –

+0

Мне редко требовалось мгновенное оповещение о чем-то в журнале, поэтому я пропустил это. Хороший улов Ансгара. – websch01ar

+1

Собственно, 'get-content -wait' был в v2, но' -Tail n' не был. Итак, верно, что 'gc -wait' фактически совпадает с' tail.exe -f'. В идеале я бы сделал 'gc -wait -tail 1', который на v3 дал бы мне одну строку за раз, пока файл не будет закрыт. Однако, я считаю, что '-wait' блокирует конвейер, как упоминал @mjolinor. – user3195248

0

Если вы должны использовать «tail.exe», используйте «&», чтобы сделать линию выполните все вместе, как в командной строке. Затем разделите вывод на «n» (новая строка). После этого вы можете найти строки, которые соответствуют тому, что вы ищете, и либо записать их на консоль, либо записать их в другой файл журнала.

$log = "\\server\file.log" 
$tail = & tail.exe -f $log | ?{$_ -split "`n"} 
Foreach($line in $tail) 
{ 
    if($line -match "this") 
    { 
     Write-Host $line 
     Out-File -InputObject $line -FilePath \\server\important-logs.log 
    } 
} 
+0

Для PowerShell версии 2, попробуйте: 'get-content \\ server \ file.log -Wait | ? {$ _ -match "criteria"} ' Для версии PowerShell 4, попробуйте: ' Get-Content \\ server \ file.log -Tail 10 | ? {$ _ -match "criteria"} ' ' # -Tail 10 может быть любым количеством строк. Надеюсь, что это поможет. T.CK –