我希望监视一个日志文件,该文件在2小时内不断添加(每隔几秒)。我目前正在使用Get-Content file.txt -Wait,它将内容显示在屏幕上,并允许我查看正在添加到文件中的内容,但我需要更进一步,实际上注意特定的消息,如果有的话我m出现在日志文件中,然后做一些事情。最初我使用带有for循环的.net文件阅读器,如下所示
try {
for(;;) {
$line = $log_reader.ReadLine()
if ($line -match "something")
{
Write-Host "we have a match"
Break
}
然而问题是它导致生成日志文件的进程崩溃 - 它抛出一个错误(因为另一个进程正在使用它正在创建的日志文件 - 我认为这很奇怪,因为我假设.net流阅读器只是'读'文件)。我对生成日志文件的进程没有任何控制权,所以我不知道它正在做什么(我猜它有文件处于读/写模式,带有某种锁,当我感到不安时尝试使用.net流阅读器读取文件。但是,对文件执行Get-Content似乎不会导致此问题。 问题是,我如何使用Get-Content(或其他进程)之类的东西来监视日志文件,但如果我在日志中查找的消息出现,则可以转到脚本的另一部分?
答案 0 :(得分:1)
如果您经常想要监视日志文件并在出现时立即捕获所需的模式:
while(!(Select-String -path 'c:\log.txt' -pattern 'something' -quiet)){};
## when finds the pattern, comes out of the loop and proceed to next part of the script
Write-host 'we have a match'
您可能希望将文件路径更改为您的路径。
虽然这会起作用,但是由于while循环是一个常量循环,因此计算机必须进行大量处理。如果你有能力引入一些延迟,比如可以找到错误30秒或你的阈值是什么,在它出现后,你可以考虑引入睡眠:
while(!(Select-String -path 'c:\log.txt' -pattern 'something' -quiet)){start-sleep -seconds 30};
## when finds the pattern, comes out of the loop and proceed to next part of the script
Write-host 'we have a match'
你可以编写一个小逻辑来在两个小时后终止脚本,否则它会变成一个无限循环,如果在日志文件中根本没有写出'something'。
编辑1:
如果要在控制台上打印新行,可以尝试操作:
while(!(Select-String -path 'c:\log.txt' -pattern 'something' -quiet))
{
$a = get-content 'c:\log.txt'
if(($a.count) -gt $b )
{
$a[$b..($a.count)]
}
$b = ($a.count)
start-sleep -Seconds 30
}
## To print the line containing the pattern when while loop exited
(Get-content 'c:\log.txt')[-1]