Powershell - 监控实时日志文件 Q2

Powershell - Monitoring live log file 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

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

我在 SO 上找到了 this post,这正是我想要做的,OP 声称它对他有用。我出于我的目的稍微修改了它,但它不会将与所需字符串匹配的事件写入 sras_pages.log

这是 'modified' 代码:

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

像这样:

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
}