Powershell 3.当日志文件更新时,拖尾日志文件不会将输出更新到控制台

时间:2014-03-07 21:30:41

标签: powershell-v3.0 tail logfile

我希望在Windows上更新日志文件。我使用的是PowerShell 3.0版。其他人说要做:

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

但是,当我向服务器发送新查询(并因此更新query.log)时,PowerShell会在终端挂起,并且不会向终端吐出任何新的“拖尾”。使用powershell来“吐出”query.log中尾部的其余部分的唯一方法是在notepad ++中手动打开我的query.log,和/或从我的文本编辑器关闭query.log,然后才会打开Powershell将剩余的日志文件发送到终端。

我希望不必打开和关闭powershell脚本的日志文件来更新终端。

非常感谢

1 个答案:

答案 0 :(得分:1)

感谢'baretail'推荐。 AFAIK,我无法将文本从baretail流式传输到powershell中的变量,因此我可以对日志数据进行进一步处理。

所以,我自己编写了一个尾部函数。随意使用它。这个脚本有一些需要注意的事项: 1.我使用了'Get-Content'(因此对于很长的日志文件,您可能希望优化此命令) 2.我的while循环中没有使用'sleep'功能,所以这个功能非常占用CPU。 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
  }
}