2009-01-13 86 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

相关问题