Powershell 3. Хвост файла журнала не обновляет вывод на консоль по мере обновления файла журнала.

Я хочу сохранить файл журнала в Windows, поскольку этот файл журнала обновляется. Я использую PowerShell версии 3.0. Другие люди говорят делать:

Get-Content C:\some\server\logs\query.log -Tail 4 -Wait

Однако, когда я отправляю новые запросы на сервер (и, следовательно, обновляю query.log), PowerShell зависает на терминале и не выдает никаких новых «хвостов» на терминал. Единственный способ заставить powershell «выплюнуть» остальную часть хвоста в query.log — это вручную открыть мой query.log в блокноте ++ и/или закрыть query.log из моего текстового редактора, только тогда Powershell печатает остальную часть файла журнала на терминал.

Я бы не хотел открывать и закрывать файл журнала для сценария powershell для обновления терминала.

огромное спасибо


person user1709076    schedule 07.03.2014    source источник
comment
Быстрый Google показывает, что параметр -wait ограничен. Это работает только тогда, когда файл журнала открыт/записан/закрыт. Если процесс записи журнала держит файл открытым между записями журнала, то get-content -wait не будет работать должным образом. Полное пошаговое руководство см. в разделе stackoverflow.com/questions/19919180/   -  person andyb    schedule 09.03.2014
comment
Я могу порекомендовать BareTail...baremetalsoft.com/baretail   -  person andyb    schedule 09.03.2014


Ответы (1)


спасибо за рекомендацию "голого хвоста". Насколько мне известно, мне не удалось передать текст из baretail в переменную в powershell, чтобы я мог выполнять дальнейшую обработку данных журнала.

Итак, я сам написал хвостовую функцию. Не стесняйтесь использовать его как есть. При работе с этим сценарием следует помнить о некоторых вещах: 1. Я использовал Get-Content (поэтому для очень длинных файлов журналов вы можете оптимизировать эту команду) 2. Я не использую функцию «сна» в мой цикл while, поэтому эта функция очень интенсивно использует процессор. 3. Я использовал «Get-Content», а не «io FileStream», потому что io FileStream не смог открыть файлы журналов, которые «заблокированы» другими процессами (например, записью сервера в файл журнала). Хотя я думаю, что FileStream был бы более эффективным, поскольку я мог бы «искать» байтовые блоки из файла вместо «Get-Content», который загружает весь файл? 4. Этот сценарий способен отслеживать файлы журналов, размер которых иногда УМЕНЬШАЕТСЯ (например, когда сервер перемещает слишком большой файл журнала из одного места в другое и создает новый файл журнала с тем же именем вместо старого). один). Хотя, если это произойдет, возможно, что самый последний журнал в файле журнала не будет захвачен при создании нового журнала. $pathToLogFile = 'C:\path\to\logs\query.log'

Function getFileSize($path)
{
  return (Get-Item $path).length
}

Function Tail($pathToLogFile, $fileSizeAtLastTail, $currentFileSize)
{ 
  if($currentFileSize -ne $fileSizeAtLastTail)
  {
    if ($currentFileSize -gt $fileSizeAtLastTail)
    { #Take just what is new since the last tail
      $numberOfNewBytes = $currentFileSize-$fileSizeAtLastTail
      $buf              = new-object byte[] $numberOfNewBytes
      $fs               = Get-Content $pathToLogFile -encoding Byte
      $byteTail         = $fs[$fileSizeAtLastTail .. $currentFileSize]
    }
    else
    { #Take the whole file (an new file.log was created)
      $numberOfNewBytes = $currentFileSize
      $buf              = new-object byte[] $numberOfNewBytes
      $fs               = Get-Content $pathToLogFile -encoding Byte
      $byteTail         = $fs[0 .. $currentFileSize]
    }
    #Turn bytes into a string
    $enc  = [System.Text.Encoding]::ASCII
    $tail = $enc.GetString($byteTail)
    return $tail
  }
  else
  {
    return ""
  }
}

while(1)
{
  $fileSizeAtLastTail = $currentFileSize
  $currentFileSize    = getFileSize $pathToLogFile
  $tail               = Tail $pathToLogFile $fileSizeAtLastTail $currentFileSize 
  if($tail)
  {
    $tail
  }
}
person user1709076    schedule 10.03.2014