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

时间:2019-02-03 04:36:15

标签: windows powershell loops tail

我需要完善此脚本。我需要它在多个(5个-都在同一位置的日志文件)Windows系统上运行。我很难弄清楚如何确保可以同时“尾部”所有5台服务器上的条目的日志并返回“ OK”;仅在所有5台服务器上都生成日志条目时才终止作业,而不仅仅是说其中4台。

这是要做什么:

  1. 启动服务
  2. “尾巴”日志文件
  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循环来完成-拖尾并等待CSV文件中所有5个远程系统上的日志输入?

1 个答案:

答案 0 :(得分:2)

简而言之,不能一次不在同一会话中,而是一次全部。每个日志必须位于其自己的会话中。我怎么知道,因为我花了很多时间来尝试实现这一目标。好吧,您可以一次只配置一台服务器,完成后使用循环将其移至下一台服务器。

您可以使用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,也不需要执行“开始睡眠”和“抓线”步骤。

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

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

因此,尽管我不太确定为什么您要-tail this并观看这些日志滚动,因为您只是在寻找简单的字符串

恕我直言,我建议您同时并行启动每个后台作业,并让该作业提醒您;文字,电子邮件,屏幕警报等,当他们返回您想要的结果时。