我目前正在研究編寫一個處理日誌文件的程序。目的是日誌文件不應超過50MB,所以我正在重命名該文件並創建一個新文件,然後它應該開始寫入新文件。爲了避免在文件更改時將數據寫入日誌,我在考慮在程序的一部分中將數據添加到緩衝區,然後在程序的另一部分中讀取緩衝區中的數據並將其輸出到文件。如果它不能寫入文件,它會將它保存在緩衝區中,直到它可以寫入文件。將數據寫入緩衝區並從緩衝區讀取數據
我該如何去做這件事我似乎無法在Google上找到任何東西,不知道我是否在尋找正確的東西。
感謝您的幫助,您可以提供
我目前正在研究編寫一個處理日誌文件的程序。目的是日誌文件不應超過50MB,所以我正在重命名該文件並創建一個新文件,然後它應該開始寫入新文件。爲了避免在文件更改時將數據寫入日誌,我在考慮在程序的一部分中將數據添加到緩衝區,然後在程序的另一部分中讀取緩衝區中的數據並將其輸出到文件。如果它不能寫入文件,它會將它保存在緩衝區中,直到它可以寫入文件。將數據寫入緩衝區並從緩衝區讀取數據
我該如何去做這件事我似乎無法在Google上找到任何東西,不知道我是否在尋找正確的東西。
感謝您的幫助,您可以提供
我建議使用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。
這不能用作它的.net 4,我的程序必須是.net 3.5 – Boardy 2012-04-20 14:15:32
@Boardy:查看我更新的答案。 – 2012-04-20 15:40:16
爲什麼不讓記錄儀本身決定何時旋轉日誌?這樣你就沒有任何爭論。 – 2012-04-19 21:30:24
嘗試[log4Net](http://logging.apache.org/log4net/) – 2012-04-19 21:32:40
Log4Net相當不錯。 – Sandeep 2012-04-19 21:34:03