Powershell - 监控实时日志文件Q2

时间:2015-01-18 21:39:00

标签: powershell logging monitor

我提出了一个初步问题here已经回答了这个问题,但随着我的工作进展,我遇到了另一个问题。

摘要:我有一个通过串行设备写入的日志文件。我想监视这个日志文件中的特定字符串(事件),当它们发生时,我想将这些字符串写入一个单独的文件。

执行这一项是我正在寻找的:

$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

问题是日志文件获取了一个日期戳,putty将其保存为SRAS_yyyy-mm-dd.log。因此,当时钟经过午夜时,将不再查看正确的文件。

我在SO上发现了this帖子,这正是我想做的事情,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的建议。

1 个答案:

答案 0 :(得分:1)

以下是一些可以使其发挥作用的建议更改:

  1. $ p在作业中不存在,将其添加为参数(在我的示例中为$ pattern)
  2. 您指的是工作中的$ fullpath(第13行),它应该是$ file。
  3. 将参数-SimpleMatch添加到select-string以搜索文字字符串而不是正则表达式。 (这不是必需的,但如果你改变搜索模式就会派上用场)
  4. 参考$ pattern而不是$ p(见1)
  5. 在第16行跳过foreach。
  6. 像这样:

    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
    }