2015-01-18 3 views
-1

Я задал начальный вопрос here На что ответили, но когда я двигаюсь в своей задаче, у меня возникает другая проблема.Powershell - Мониторинг файла журнала в реальном времени Q2

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

Выполнение этого единовременные делает то, что я ищу:

$p = @("AC/BATT_PWR","COMM-FAULT") 
$fileName = "SRAS_$(Get-Date -format yyyy-MM-dd).log" 
$fullPath = "C:\temp\SRAS\$fileName" 
Get-Content $fullpath -tail 1 -Wait | Select-String -Pattern $p -SimpleMatch | Out-File -Filepath C:\temp\SRAS\sras_pages.log -Append 

Проблема заключается в лог-файл получает штамп времени, шпатлевка сохраняет его как SRAS_yyyy мм dd.log. Поэтому, когда часы пройдут полночь, это больше не будет смотреть на правильный файл.

Я нашел this пост на SO, который именно то, что я хочу сделать, OP утверждает, что он работает на него. Я ее немного модифицировал для моих целей, но не записывает события, соответствующие нужные строки в sras_pages.log

Это «модифицированный» код:

while($true) 
{ 
    $now = Get-Date 
    $fileName = "SRAS_$(Get-Date -format yyyy-MM-dd).log" 
    $fullPath = "C:\temp\SRAS\$fileName" 
    $p = @("AC/BATT_PWR","COMM-FAULT") 

    Write-Host "[$(Get-Date)] Starting job for file $fullPath" 
    $latest = Start-Job -Arg $fullPath -ScriptBlock { 
     param($file) 

     # wait until the file exists, just in case 
     while(-not (Test-Path $fullpath)){ sleep -sec 10 } 

     Get-Content $file -Tail 1 -wait | Select-String -Pattern $p | 
      foreach { Out-File -Filepath "C:\temp\SRAS\sras_pages.log" -Append } 
    } 

    # wait until day changes, or whatever would cause new log file to be created 
    while($now.Date -eq (Get-Date).Date){ sleep -Sec 10 } 

    # kill the job and start over 
    Write-Host "[$(Get-Date)] Stopping job for file $fullPath" 
    $latest | Stop-Job 
} 

Если я исполняю только Get-Content сегмент, который кода он делает именно то, что я ищу. Я не могу понять, в чем проблема.

TIA для консультации.

+0

Итак, после полуночи вам нужно, чтобы ваш скрипт продолжал проверять предыдущий файл журнала, пока не будет создан новый файл журнала? – Bluecakes

+0

Мне нужен скрипт для мониторинга текущего файла журнала, а не предыдущего дня. При изменении даты он должен начать мониторинг нового файла, который будет создан после возникновения события на последовательном порту. – k1162

ответ

1

Вот несколько предлагаемых изменений, которые должны заставить его работать:

  1. $ р не существует в работе, добавьте его в качестве параметра ($ шаблон в моем примере)
  2. Вы ссылаетесь $ fullpath в вашей задаче (строка 13), он должен быть $ file.
  3. Добавить параметр -SimpleMatch для выбора строки для поиска литералов, а не регулярных выражений. (Это не требуется, но может пригодиться, если вы изменить шаблон поиска)
  4. Ссылаясь на $ шаблон вместо $ р (см 1)
  5. Пропустить Еогеасп на строке 16.

Как это:

while($true) 
{ 
    $now = Get-Date 
    $fileName = "SRAS_$(Get-Date -format yyyy-MM-dd).log" 
    $fullPath = "C:\temp\SRAS\$fileName" 
    $p = @("AC/BATT_PWR","COMM-FAULT") 

    Write-Host "[$(Get-Date)] Starting job for file $fullPath" 
    $latest = Start-Job -Arg $fullPath, $p -ScriptBlock { 
     param($file,$pattern) 

     # wait until the file exists, just in case 
     while(-not (Test-Path $file)){ sleep -sec 10 } 

     Get-Content $file -Tail 1 -wait | Select-String -Pattern $pattern -SimpleMatch | 
      Out-File -Filepath "C:\temp\SRAS\sras_pages.log" -Append 
    } 

    # wait until day changes, or whatever would cause new log file to be created 
    while($now.Date -eq (Get-Date).Date){ sleep -Sec 10 } 

    # kill the job and start over 
    Write-Host "[$(Get-Date)] Stopping job for file $fullPath" 
    $latest | Stop-Job 
} 
+0

Спасибо за ответ, но, к сожалению, он все еще не работает. Outfile никогда не записывается. – k1162

+0

Понятно, я внимательно посмотрел и обновил свой пример. Надеюсь, это сработает для вас. –

+0

ВЫ УДИВИТЕЛЬНО! Я бы поднял ставку, если бы мог, но не имел необходимых очков репутации. Это работало как шарм, я не понимал, что переменные вне скриптового блока должны быть переданы в параметры внутри, но при этом имеет общий смысл. Еще раз спасибо! – k1162

Смежные вопросы