2009-01-13 49 views
3

我需要讀取.NET 3.5sp1中的滾動日誌文件。我想知道做這件事的最好方法是什麼?該文件可以變得非常大。一個想法,我是在.NET中讀取滾動日誌文件的最佳方法是什麼?

  • 打開文件
  • 讀文件到最後的讀取線(在第一種情況下,它是0)
  • 閱讀所有剩餘的行
  • 關閉流並記住最後一行號碼讀取。
  • 等一下。
  • 沖洗/重複。

我不確定這是否是最好的方式,儘管對內存有效,考慮到文件可能相當大。我不能有日誌文件被鎖定或者:(

思考

回答

0

獲取文件長度並讀取文件的最後一部分。不難找到第一個換行符並顯示所有內容。 FileStream有一個Length屬性,並且read方法允許您從一個位置讀取到另一個位置。

史蒂文是對的。如果其他程序不需要獨佔訪問權限,則可以打開只讀且沒問題。

1

下面是使用文件系統觀察程序打開文件並讀取新的數據,因爲它是寫的一個例子:

http://www.codeproject.com/KB/cs/wintail.aspx

這個例子看起來不錯,但不要爲了愛皮特和所有的東西而模糊使用鎖(this),它是不好的,使用一個新的對象,而不是你可以在類中的所有對象之間共享。

如果y ou打開文件ReadOnly您不應該有共享衝突,這取決於您的文件如何被附加到日誌文件的程序打開。

0

你可以追加到文件,而不是跟蹤你在哪裏?

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上,而不是在文件本身上。這會有幫助嗎?

+0

我不是寫給日誌的人.....我正在讀別人的滾動日誌... – 2009-01-13 03:54:08

相關問題