2014-01-29 34 views
0

我正在使用創建日誌文件的應用程序。由於軟件本身的錯誤,它不斷產生三個我不感興趣的錯誤。每一行都有一個唯一的標識符,所以我不能只是更換這行,因爲每一行都是不同的。用特定的字符串替換行並保存爲相同的名稱

我有兩個主要的問題:我需要用相同的名稱保存它,而它的工作原理應該是可用的(如果記錄器需要寫東西)。

我無法對原始應用程序進行硬編碼,以防止它編寫日誌的那部分內容。

到目前爲止我試過:

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)但是我需要它以原始名稱保存文件)

+1

爲什麼你需要用相同的名字保存它?我不認爲這是個好主意。如果文件在寫入時被鎖定,則日誌記錄系統可能無法記錄條目(具體取決於它的複雜程度)。 –

回答

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

我知道你說你要保存的文件名相同,但如果你想要一個原因是要在日誌被不斷更新,那麼你可以做的以下內容:

Get-Content -Wait log.log | 
    ? {$_ -notmatch 'ERROR1|ERROR2|ERROR3' } | 
    Out-File log_stripped.log 

請注意 - 等待Get-Content。

log_stripped.log將不斷更新,因爲log.log已更新。

相關問題