2009-08-07 32 views
0

我正在編寫將使用日誌文件的應用程序。我想要做的是當應用程序啓動時,它將檢查日誌文件是否超過特定大小,如果是,它會從日誌文件頂部刪除「x」行數量以縮短日誌文件的大小。這將是一個很好的方式去做這件事?將最新的條目寫入文件的頂部,然後在刪除時從底部刪除會更容易些嗎?刪除文本文件頂部的x行數

回答

1

所以,你有一個日誌文件,姑且稱之爲 「log.log

首先,移動log.loglog.log.bak。打開它閱讀。一行一行閱讀,直到閱讀完x行數。寫一個新文件,log.log。繼續閱讀log.log.bak中的每行,並將其寫入log.log。當沒有更多行時,關閉log.loglog.log.bak,然後刪除log.log.bak。

一些僞代碼:

x = number of lines to delete 

move log.log to log.log.bak 

open log.log.bak for reading 
while i have read < x lines 
    read a line and throw it away 

open log.log for writing 
while there are more lines in log.log.bak 
    read a line from log.log.bak 
    write the line to log.log 

close log.log 
close log.log.bak 

delete log.log.bak 
1

有很多的問題,左開

  1. 什麼環境,是你?在Un * x中,您可以簡單地'tail -100 input.txt> trimmed.txt'
  2. 您可以將文件加載到內存中,還是會過大?
  3. 你可以使用中間文件嗎?
  4. 您有哪些語言可用/您是否熟悉?
  5. 您多久進行一次修整?如果您的寫作比修剪更頻繁,請寫下底部(速度很快)並且很少執行昂貴的修剪操作。

如果您有C可用,您可以找到與fseek(f,0,SEEK_END);long size=ftell(f);(打開f後立即)的文件大小。

如果您需要修剪,可以使用fseek(f,size-desired_size,SEEK_SET);,然後使用while (fgetc(f)!='\n') {},這會將您帶到相交線的末端。

然後將剩餘的文件複製到新文件中。

1

我不會刪除一定數量的行。基本上你必須處理整個文件,如果你這樣做,那可能是很多處理。通常的做法是滾動日誌文件(將其重命名,通常只添加日期)並重新開始。

還要記住,文件是一定大小不能保證有必要的行,在這種情況下,你只是以昂貴的方式重命名文件。

我經常發現它也適用於應用程序啓動時也從文件頂部開始。

0

爲每種日誌保留幾個日誌文件File1-FileN。 當每個文件通過一些固定的大小時,填充文件File1然後File2等等。 當你填充FileN刪除File1並重新開始(刪除)並重寫File1,File2 ...

這給你一個週期性的固定大小日誌。

注意:這要求您跟蹤哪些是要寫入的當前日誌文件。這可以存儲在一個單獨的日誌文件中。