Powershell:跟踪日志并处理每一行

Powershell:跟踪日志并处理每一行,powershell,powershell-2.0,tail,Powershell,Powershell 2.0,Tail,我需要创建一个系统来实时监控日志,并在IP是外来的情况下发送警报 我更愿意使用powershell(v2,由于服务器重新训练)来实现这一点,因为我已经有了一个处理前一天日志的系统,并且我能够重用很多功能 我可以成功地跟踪文件(使用tail.exe)并选择重要的行,但我似乎无法捕获每一行并对其进行处理 我的基本要点是: tail.exe -f \\server\file.log | where-object {$_ -match "criteria"} 当我试图将结果传输到foreach时,我什

我需要创建一个系统来实时监控日志,并在IP是外来的情况下发送警报

我更愿意使用powershell(v2,由于服务器重新训练)来实现这一点,因为我已经有了一个处理前一天日志的系统,并且我能够重用很多功能

我可以成功地跟踪文件(使用tail.exe)并选择重要的行,但我似乎无法捕获每一行并对其进行处理

我的基本要点是:

tail.exe -f \\server\file.log | where-object {$_ -match "criteria"}
当我试图将结果传输到foreach时,我什么也得不到


有什么建议吗?

只需使用Get-Content PowerShell Cmndlet,它将返回一个System.Array对象

$Content = Get-Content "Path to log.log" | ? { $_ -match "something" }

tail命令将在管道运行期间阻塞管道。一种选择是在后台作业中运行tail,并在主脚本中以无休止的循环处理结果:

$Job = Start-Job -ScriptBlock { tail.exe -f \\server\file.log }

 While ($true){
 Recieve-Job $Job | 
 Where-Object { $_ -match "criteria" }
 Start-Sleep -Seconds 10
}
如果必须使用“tail.exe”,请使用“&”使该行像在命令提示符中一样一起执行。然后将输出除以“`n”(新行)。之后,您可以找到与您要查找的内容相匹配的行,并将它们写入控制台或写入另一个日志文件

$log = "\\server\file.log"
$tail = & tail.exe -f $log | ?{$_ -split "`n"}
Foreach($line in $tail)
{
    if($line -match "this")
    {
        Write-Host $line
        Out-File -InputObject $line -FilePath \\server\important-logs.log
    }
}

tail-f
“跟随”一个附加数据的文件
Get Content
可以通过参数
-Wait
实现这一点,但在PowerShell v3之前没有引入这一点,而OP仅限于v2。我很少需要对日志中的某些内容发出即时警报,因此我忽略了这一点。很好,Ansgar。实际上,
获取内容-等待
在v2中,但
-Tail n
不是。因此,
gc-wait
tail.exe-f
实际上是一样的。理想情况下,我会执行
gc-wait-tail 1
,在v3上,它会一次给我一行,直到文件关闭。然而,我相信
-wait
正在阻塞@mjolinor提到的管道。@user3195248啊,你说得对。我只是选中了
Get Help Get Content
(没有列出选项),而没有尝试实际运行该命令。这是可行的。我可以从
$job
获取数据。问题是作业只是不断地添加数据。我想我需要离开GC/tail,转而使用某种streamReader。然后我就可以轻松地处理每一行了……但对于我身后的读者来说,使用powershell v3和
-tail 1
可以轻松地一次处理一行事件。最终的解决方案是使用流
$sr=new object System.IO.StreamReader(new object System.IO.FileStream(“$filename”,“open”,“Read”,“Read”,“ReadWrite”))
。对于PowerShell版本2,请尝试:
get content\\server\file.log-Wait |?{$|-match“criteria”}
对于PowerShell版本4,请尝试:
get content\\server\file.log-Tail 10{$|-match“criteria
#-尾部10可以是任意数量的行。
我希望这有帮助。特克