【问题标题】:How to tail log files in Powershell for particular string如何在 Powershell 中跟踪特定字符串的日志文件
【发布时间】:2014-10-24 09:37:58
【问题描述】:

我们希望在 powershell 中为特定字符串“实时”跟踪几个日志文件。我们尝试使用“get-content”命令但没有运气,因为每次结果我们只收到一个文件的结果。我假设它是由“-wait”参数引起的。如果有任何其他方式来跟踪多个文件?我听说过运行空间,但我仍然不知道如何实现它。

我们的示例脚本如下

dir d:\test\*.txt -include *.txt | `
Get-Content -Wait | `
select-string "windows" | `
ForEach-Object {Write-EventLog -LogName Application -Source "Application error" -EntryType information -EventId 999 -Message $_}

任何帮助将不胜感激。

【问题讨论】:

  • 使用 get-childitem 代替 dir 并移除 -wait 开关,看看是否有效
  • 感谢您的快速响应,但这不是我所需要的。我需要跟踪特定目录“live”中的几个 txt 文件,这就是我使用“-wait”选项的原因。

标签: powershell tail


【解决方案1】:

聚会可能有点晚了……

根据here,我们可以在 .ps1 文件中使用以下内容;

$ProgressPreference='SilentlyContinue'
Workflow My-Tail
{
    Param([string[]] $Path)

    foreach -parallel ($file in $path)
    {
        Get-Content -Path $file -Tail 1 -Wait
    }
}

这让我们可以跟踪多个文件,像在 powershell 中调用;

My-Tail (dir C:\Users\User\Documents\*.log)

剩下的就是按所需的字符串过滤;

My-Tail (dir C:\Users\User\Documents\*.log) | Select-String -Pattern ".*ERROR.*"

这将在 Documents 中拖尾所有以 .log 结尾的文件,输出包含文本 'ERROR' 的行

【讨论】:

  • 这非常适合我需要的东西,除了当它们都被同时读取时我无法分辨哪个文件是哪个文件。有没有办法在自己的窗口/实例中打开每个“获取内容”?
【解决方案2】:

我能想到的唯一方法是创建一堆在每个文件上运行命令的作业。然后您可以循环接收作业输出,并且任何文件的更改都将写入屏幕:

gci d:\test\*.txt | % { $sb = [scriptblock]::create("get-content -wait $_") ; start-job -ScriptBlock $sb }
while(1) { 
  $m = $(get-job | receive-job | select-string "searchstring") 
  if($m -ne $null) { 
     Write-EventLog -LogName Application -Source "Application error" -EntryType information -EventId 999 -Message $m
  }
  sleep 1 
}

【讨论】:

  • 好的,但是如果有办法找到特定单词并在 Windows 日志中生成事件?我问过这个问题是因为我们想监控特定应用程序的错误并将事件写入日志,然后我们的 Nagios 系统会发出警报。
  • 谢谢,但脚本返回错误写入事件日志:无法验证参数“消息”的参数。参数为空、空或参数集合的元素包含空值。提供一个不包含任何空值的集合,然后再次尝试通信。在 D:\FIX.ps1:4 char:112 + ... d 999 -Message $m + ~~ + CategoryInfo : InvalidData: (:) [Write-EventLog], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft。
  • 您是否在没有Write-EventLog 行的情况下运行它以确保首先正确填充消息?
  • 不,我几乎完全按照您提供的方式运行它,我只更改了“searchstring”属性并将代码保存为 ps1。那我到底应该怎么做呢?
  • 再次编辑,实际上需要检查$m是否为空,然后再尝试写入事件日志。您可能希望在测试时将Write-EventLog ... 替换为Write-Host $m。这会将结果写入屏幕。
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
相关资源
最近更新 更多