我正在使用创建日志文件的应用程序。由于软件本身的错误,它会产生三个我不感兴趣的错误。每一行都有一个唯一的标识符,所以我不能只更换该行,因为每一行都不同。
我有两个主要问题:我需要使用相同的名称保存它,当它工作时,文件应该可用(如果记录器需要写东西)。
我无法对原始应用进行硬编码,以防止它写入日志的那一部分。
到目前为止我已尝试过:
Get-Content log.log | Where-Object {$_-notmatch 'ERROR1' -And $_-notmatch 'ERROR2' -And $_-notmatch 'ERROR3' } `|Set-Content log_stripped.log
^仅当输出文件具有不同的名称时才有效。
Get-Content error.log | foreach-object { Where-Object {$_-notmatch 'ERROR1' -And $_-notmatch 'ERROR2' -And $_-notmatch 'ERROR3' } } | Set-Content error.log
^这个冻结了我的PS会话。
我也尝试将文件读取到变量:
$logcontent = ${h:error.log}
但我收到了System.OutOfMemoryException。
理想情况下,我需要的是读取日志文件,删除我不想要的所有行,然后用原始名称保存它。
想法? (请记住,使用不需要的数据时,日志文件为+/- 900 MB;使用第一种方法剥离数据时,日志文件为45mb - 但我需要它以原始名称保存文件)
答案 0 :(得分:1)
当您仍然从中读取文件时,无法将文件保存为相同的名称,这意味着您必须在开始编写之前将整个900MB读取到内存中。不是个好主意。
试试这个:
Remove-Item log_stripped.log
Get-Content log.log -ReadCount 1000 |
foreach {$_ -notmatch 'ERROR1|ERROR2|ERROR3' | Add-Content log_stripped.log }
Remove-item log.log
Rename-Item log_stripped.log log.log
答案 1 :(得分:1)
我知道您说要保存到相同的文件名,但如果您想要的原因是您希望日志不断更新,那么您可以执行以下操作:
Get-Content -Wait log.log |
? {$_ -notmatch 'ERROR1|ERROR2|ERROR3' } |
Out-File log_stripped.log
注意Get-Content上的-Wait。
随着log_stripped.log
的更新, log.log
会不断更新。