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 征求意见。
这里有一些建议的更改,应该可以使它起作用:
- $p 在作业中不存在,将其添加为参数(在我的示例中为 $pattern)
- 您指的是作业中的 $fullpath(第 13 行),它应该是 $file。
- 将参数 -SimpleMatch 添加到 select-string 以搜索文字字符串而不是正则表达式。 (这不是必需的,但如果您更改搜索模式会派上用场)
- 指的是 $pattern 而不是 $p(见 1)
- 跳过第 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
}
我提出了一个初始问题
总结:我有一个正在通过串行设备写入的日志文件。我想监视此日志文件中的特定字符串(事件),当它们发生时我想将这些字符串写入单独的文件。
执行这个就可以满足我的要求:
$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 征求意见。
这里有一些建议的更改,应该可以使它起作用:
- $p 在作业中不存在,将其添加为参数(在我的示例中为 $pattern)
- 您指的是作业中的 $fullpath(第 13 行),它应该是 $file。
- 将参数 -SimpleMatch 添加到 select-string 以搜索文字字符串而不是正则表达式。 (这不是必需的,但如果您更改搜索模式会派上用场)
- 指的是 $pattern 而不是 $p(见 1)
- 跳过第 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
}