【问题标题】:PowerShell script to tail log file on multiple remote servers用于在多个远程服务器上跟踪日志文件的 PowerShell 脚本
【发布时间】:2019-02-03 04:36:14
【问题描述】:

我需要完善这个脚本。我需要它在多个(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 个远程系统上的日志条目?

【问题讨论】:

    标签: windows powershell loops tail


    【解决方案1】:

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

    您可以使用 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 和线路抓取步骤的需要。

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

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

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

    恕我直言,我建议将每个工作都作为后台工作并行启动,并让该工作提醒您;文本、电子邮件、屏幕警报等,当它们返回您所追求的结果时,您就可以了。

    【讨论】:

    • 非常感谢,postanote!我想详细说明你的观察。对于初学者,我正在处理具有气质问题的定制应用程序;它是一个赌场游戏应用程序。我需要确保(通过使用 tail 或任何东西)日志条目出现在文件中,因为日志条目由于启动先前的服务而被激活。如果此特定日志条目不在日志文件中并且我启动下一个依赖服务,则游戏应用程序将无法运行。这是供应商意识到的设计缺陷。目前,我们只是尝试将这项繁重的任务自动化。
    • 我不介意使用您提供的任何一种情况执行此操作:为每个服务器使用一个实例,或者一次执行一个实例,也就是您所说的油漆干燥会话,因为日志条目平均是在~2 分钟标记。
    • 我在必须支持的企业供应商解决方案中遇到了类似的问题,我将这种方法作为现场团队可重复的故障排除工作。我的工具会查找字符串、发送和提醒,然后仅在成功时根据需要启动其他服务,然后再次检查所有服务。为什么,偏执狂。我使用 ISE 与控制台主机,因为 ISE 允许打开多个选项卡,即使在使用远程服务器时也是如此。因此,只有一个主 ISE GUI,具有多个本地或远程选项卡。
    • 非常感谢。你提到了为什么要使用tail。这是否意味着我可以通过搜索字符串更有效地执行此操作?我不知道该怎么做。事实上,我需要跟踪的唯一原因是实际查看/验证生成日志条目以继续启动我的下一个服务。
    • 取决于目标。当您在它发生的那一刻捕获并记录条目时,尾巴非常棒。使用字符串搜索,当然会产生延迟,您会决定并认为这是可以接受的。这意味着您可以让操作一次运行所有目标,并每隔几秒检查一次所有目标上的字符串。在我的工具中,大约十几个服务器上的大约 3 到 9 个服务,在故障排除会话期间,我会做同样的事情。当通信流为相关需求而发生时,我使用尾部来捕获日志数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多