0

项目:我有一个正在不断添加的日志文件。在此日志文件中,有时会添加一个错误(错误始终包括“无法导入”和唯一 ID)。当此错误添加到日志文件时,我需要通过电子邮件收到警报。

项目的当前状态:我有脚本(它计划每 15 分钟运行一次)使用 Select-String 扫描日志文件,如果发现此错误,则将其添加到名为 alert-(Get -日期).txt。在 PS 脚本结束时,alert.txt 文件会通过电子邮件发送给我。

问题:每天都会创建一个新的日志文件,因此我的脚本只扫描该文件。问题是一旦发现错误,每次后续扫描都会向我发送我已经知道的错误的警报。我希望后续警报仅包含新错误。

当前解决问题的尝试 以下是日志文件中的示例错误:

 1/29/2015 13:38:45 1/29/2015 13:38:45  Sales Order User Import     Unable to import OHDR_2785_228038_01292015.txt due to required files missing. Files are being removed from current directory to suspense directory.

我已在脚本中添加了在日志文件中提取错误的唯一 ID 的方法。在本例中为 2785。此 ID 和其他错误 ID 被添加到另一个文本文件名 oldAlerts.txt。所以内容看起来像这样:

2785
1182
1353
1555

我想在我的脚本中添加一种方法来为 Select-String 结果排除这些行。到目前为止,这是我的 Select-String:

Get-ChildItem \txtforerp\Import\Log | Where{$_.LastWriteTime -gt (Get-Date)-$ts -AND $_.LastWriteTime -lt (Get-Date)} | select-string -Pattern "Unable to import" | Out-File $path\"$alert.txt" 

如何使用 oldAlert.txt 文件中的 ID 作为过滤器,以确保仅将新错误添加到警报中。如果我的方法不是最佳实践,我愿意使用其他方法。

4

1 回答 1

0

我建议使用否定断言前瞻来排除已报告的任何行。此外,使用 Select-String 也应该很容易识别新的 ID:

Get-ChildItem \txtforerp\Import\Log | Where{ $_.LastWriteTime -gt (Get-Date)-$ts } | 
    Select-String "Unable to import OHDR_(?!$($ids -join '|'))(\d{4})" | 
    Select-Object Filename, Line, { $_.Matches.Groups[1].Value }

在此代码$ids中表示先前标识的 ID 列表。顺便说一句:我删除了这个检查:

$_.LastWriteTime -lt (Get-Date)

检查将来是否未修改文件似乎不合理...?

于 2015-01-31T20:11:05.660 回答