用于在多个远程服务器上跟踪日志文件的 PowerShell 脚本

PowerShell script to tail log file on multiple remote servers

我需要润色这个剧本。我需要它 运行 跨多个(5 - 所有日志文件都在同一位置)Windows 系统。我很难弄清楚如何确保我可以同时 "tail" 所有 5 个服务器上的条目日志和 return 'OK';仅当在所有 5 个服务器上生成日志条目时才终止作业,而不仅仅是其中的 4 个服务器。

这是它的用途:

  1. 启动服务,
  2. "Tail" 日志文件
  3. 确认日志文件包含条目 ($waitfor)
  4. 在 Terminate 中生成日志条目后
$serviceB = "my application service"
$logfile2 = "F:\App\log\wrapper.log"
$waitFor = "[4.2.3.GA (build: SVNTag=JBoss_4_2]”

Write-Host "Starting $serviceB"
Start-Service $serviceB
Write-Host "Waiting for $waitFor in $logfile2"
while (!((Get-Content $logfile2 -Tail 30) | ? {$_ -match $waitFor})) {
    Start-Sleep -Seconds 5
}

我如何使用 foreach 循环来完成假设 - tail 并等待 CSV 文件中所有 5 个远程系统上的日志条目?

简而言之,不能在同一个会话中同时进行。每个日志都必须在其自己的会话中。我怎么知道,因为我已经尝试了太多时间来实现这一目标。好吧,您可以一次只做一个服务器,完成后使用循环移动到下一个服务器。

您可以使用 for 循环命中每个服务器主机,但您需要为每个弹出一个单独的 PowerShell 实例。

好吧,您可以在一个控制台会话中,一次只处理一台服务器,等待它完成,让它向您发送消息,完成后使用循环移动到下一个。然而,如果需要一段时间才能找到该字符串,那么这就像看着油漆变干一样。

foreach ($RemoteHost in (Import-Csv -Path 'D:\Temp\serverlist.csv')) 
{
    # You code here
    Invoke-Command -ComputerName $RemoteHost -Credential 'domain\adminname' -ScriptBlock {
        # the rest of your code here:

    }
}

既然你说远程主机,那么这意味着你需要为他们启用 PSRemoting,利用隐式删除会话并使用远程主机本地管理员组中的帐户。

您可以使用 -tail -wait,并消除对 Start-Sleep 和 line grab 步骤的需要。

使用 -tail -wait,将在创建条目时显示日志,因为它写入每个条目行。

Get-Content -Path $CurrentHostLog.FullName -Tail 0 -Wait 

所以,虽然我不太确定为什么你想要 -tail 这个并观察这些日志滚动,因为你只是在寻找一个简单的字符串

恕我直言,我建议将每一项作为后台作业并行启动,并让该作业提醒您;文本、电子邮件、屏幕提醒等,当他们 return 您想要的结果时。