2012-04-19 213 views
0

我目前正在研究編寫一個處理日誌文件的程序。目的是日誌文件不應超過50MB,所以我正在重命名該文件並創建一個新文件,然後它應該開始寫入新文件。爲了避免在文件更改時將數據寫入日誌,我在考慮在程序的一部分中將數據添加到緩衝區,然後在程序的另一部分中讀取緩衝區中的數據並將其輸出到文件。如果它不能寫入文件,它會將它保存在緩衝區中,直到它可以寫入文件。將數據寫入緩衝區並從緩衝區讀取數據

我該如何去做這件事我似乎無法在Google上找到任何東西,不知道我是否在尋找正確的東西。

感謝您的幫助,您可以提供

+0

爲什麼不讓記錄儀本身決定何時旋轉日誌?這樣你就沒有任何爭論。 – 2012-04-19 21:30:24

+1

嘗試[log4Net](http://logging.apache.org/log4net/) – 2012-04-19 21:32:40

+0

Log4Net相當不錯。 – Sandeep 2012-04-19 21:34:03

回答

1

這聽起來像是一個經典的生產者消費者問題。這是很好的起點。

Blocking Collection

正如其他人指出使用庫更好,而不是重新發明輪子。 Log4net是一個很好的日誌庫。

1

我建議使用BlockingCollection。希望寫入日誌的線程只會將日誌字符串排入BlockingCollection。一個單獨的線程監視BlockingCollection,將字符串出隊並將它們寫入文件。如果該文件不可用,該線程可以等待並再次嘗試。

有關一些簡單示例,請參閱http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

如果您不能使用BlockingCollection,您可以使用Queue並用鎖保護它。你的日誌記錄方法變爲:

private Queue<string> myQueue = new Queue<string>(); // owned by the logger 

void WriteLog(string s) 
{ 
    lock (myQueue) 
    { 
     myQueue.Enqueue(s); 
    } 
} 

刪除東西的線程可以從隊列中獲取它們。這將是理想的少一點,因爲它必須定期輪詢,但它不應該是太糟糕了:

while (!shutdown) // do this until somebody shuts down the program 
{ 
    while (myQueue.Count > 0) 
    { 
     lock (myQueue) 
     { 
      string s = myQueue.Dequeue(); 
      // write the string s to the log file 
     } 
    } 
    Thread.Sleep(1000); // sleep for a second and do it again. 
} 

有辦法做到這一點沒有忙等待,但我不請記住實施細節。有關示例,請參閱http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspx

+0

這不能用作它的.net 4,我的程序必須是.net 3.5 – Boardy 2012-04-20 14:15:32

+0

@Boardy:查看我更新的答案。 – 2012-04-20 15:40:16