我需要讀取.NET 3.5sp1中的滾動日誌文件。我想知道做這件事的最好方法是什麼?該文件可以變得非常大。一個想法,我是在.NET中讀取滾動日誌文件的最佳方法是什麼?
- 打開文件
- 讀文件到最後的讀取線(在第一種情況下,它是0)
- 閱讀所有剩餘的行
- 關閉流並記住最後一行號碼讀取。
- 等一下。
- 沖洗/重複。
我不確定這是否是最好的方式,儘管對內存有效,考慮到文件可能相當大。我不能有日誌文件被鎖定或者:(
思考
我需要讀取.NET 3.5sp1中的滾動日誌文件。我想知道做這件事的最好方法是什麼?該文件可以變得非常大。一個想法,我是在.NET中讀取滾動日誌文件的最佳方法是什麼?
我不確定這是否是最好的方式,儘管對內存有效,考慮到文件可能相當大。我不能有日誌文件被鎖定或者:(
思考
獲取文件長度並讀取文件的最後一部分。不難找到第一個換行符並顯示所有內容。 FileStream有一個Length
屬性,並且read
方法允許您從一個位置讀取到另一個位置。
史蒂文是對的。如果其他程序不需要獨佔訪問權限,則可以打開只讀且沒問題。
下面是使用文件系統觀察程序打開文件並讀取新的數據,因爲它是寫的一個例子:
http://www.codeproject.com/KB/cs/wintail.aspx
這個例子看起來不錯,但不要爲了愛皮特和所有的東西而模糊使用鎖(this),它是不好的,使用一個新的對象,而不是你可以在類中的所有對象之間共享。
如果y ou打開文件ReadOnly您不應該有共享衝突,這取決於您的文件如何被附加到日誌文件的程序打開。
你可以追加到文件,而不是跟蹤你在哪裏?
Object mLogLock = new Object(); //to make logging thread safe
string mLogFile = ""; //set your log location
string mLogDirectory = "";
public void HandleMessage(string inMessage)
{
lock (mLogLock)
{
if (!System.IO.Directory.Exists(mLogDirectory))
{
System.IO.Directory.CreateDirectory(mLogDirectory);
}
String theMessage = DateTime.Now.ToString("s");
if (inMessage != null)
theMessage += " : " + inMessage;
StreamWriter sw = new StreamWriter(mLogFile, true);
sw.WriteLine(theMessage);
sw.Dispose();
sw.Close();
}
}
否則,如果你有一個作家在一個點寫,別的東西消費,你有沒有鎖定,那麼你的程序將損壞你的日誌。這根本不是問題。您可以嘗試通過將文件打開以進行獨佔讀/寫操作來鎖定您的文件,然後其他代碼在無法讀取時會拋出異常。
如果日誌文件在同一個程序中,您可以將所有信息保存在一個大型流中,如MemoryStream,然後像上面一樣使用StreamWriter,而不是像MemoryStream一樣。然後,您的讀者和作者可以鎖定在MemoryStream上,而不是在文件本身上。這會有幫助嗎?
我不是寫給日誌的人.....我正在讀別人的滾動日誌... – 2009-01-13 03:54:08