尝试使用PowerShell监视日志文件的问题

时间:2014-04-17 07:46:30

标签: powershell logging monitoring

我希望监视一个日志文件,该文件在2小时内不断添加(每隔几秒)。我目前正在使用Get-Content file.txt -Wait,它将内容显示在屏幕上,并允许我查看正在添加到文件中的内容,但我需要更进一步,实际上注意特定的消息,如果有的话我m出现在日志文件中,然后做一些事情。最初我使用带有for循环的.net文件阅读器,如下所示

try {
for(;;) {
    $line = $log_reader.ReadLine()
    if ($line -match "something")
    { 
    Write-Host "we have a match"
    Break
    }

然而问题是它导致生成日志文件的进程崩溃 - 它抛出一个错误(因为另一个进程正在使用它正在创建的日志文件 - 我认为这很奇怪,因为我假设.net流阅读器只是'读'文件)。我对生成日志文件的进程没有任何控制权,所以我不知道它正在做什么(我猜它有文件处于读/写模式,带有某种锁,当我感到不安时尝试使用.net流阅读器读取文件。但是,对文件执行Get-Content似乎不会导致此问题。 问题是,我如何使用Get-Content(或其他进程)之类的东西来监视日志文件,但如果我在日志中查找的消息出现,则可以转到脚本的另一部分?

1 个答案:

答案 0 :(得分:1)

如果您经常想要监视日志文件并在出现时立即捕获所需的模式:

while(!(Select-String -path 'c:\log.txt' -pattern 'something' -quiet)){};
## when finds the pattern, comes out of the loop and proceed to next part of the script
Write-host 'we have a match'

您可能希望将文件路径更改为您的路径。

虽然这会起作用,但是由于while循环是一个常量循环,因此计算机必须进行大量处理。如果你有能力引入一些延迟,比如可以找到错误30秒或你的阈值是什么,在它出现后,你可以考虑引入睡眠:

while(!(Select-String -path 'c:\log.txt' -pattern 'something' -quiet)){start-sleep -seconds 30};
## when finds the pattern, comes out of the loop and proceed to next part of the script
Write-host 'we have a match'

你可以编写一个小逻辑来在两个小时后终止脚本,否则它会变成一个无限循环,如果在日志文件中根本没有写出'something'。

编辑1:

如果要在控制台上打印新行,可以尝试操作:

    while(!(Select-String -path 'c:\log.txt' -pattern 'something' -quiet))
     { 
      $a = get-content 'c:\log.txt'
      if(($a.count) -gt $b )
       {
        $a[$b..($a.count)]
       }

      $b = ($a.count) 
      start-sleep -Seconds 30
     }

   ## To print the line containing the pattern when while loop exited 
  (Get-content 'c:\log.txt')[-1]