在.NET中读取滚动日志文件的最佳方法是什么?

3
我需要在.NET 3.5sp1中读取一个滚动日志文件。我想知道最好的方法是什么?该文件可能会变得非常大。我想到的一个办法是:

  • 打开文件
  • 读取到上次读取的行(在第一次读取时,它是0)
  • 读取所有剩余的行
  • 关闭流并记住上次读取的行号。
  • 等待一段时间。
  • 重复上述步骤。

不过我不确定这是否是最好的方法,而且考虑到文件可能非常巨大,这种方法是否高效使用内存。另外,我也不能锁定日志文件 :(

您有什么想法?

3个回答

1
这是使用FileSystem Watcher打开文件并在写入新数据时读取新数据的示例:

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

例子看起来不错,但是千万不要使用lock(this),因为这很糟糕。相反,使用一个新的对象,可以在类中共享。

如果你以只读方式打开文件,那么根据程序追加到日志文件的方式,你就不会遇到共享冲突。


0

获取文件长度并读取文件的最后一部分。找到第一个换行符并显示从那里开始的所有内容不难。FileStream有一个Length属性,而read方法允许您从一个位置读取到另一个位置。

Steven是正确的。如果其他程序不需要独占访问权限,则可以以只读方式打开并正常运行。


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,而不是文件本身。这会有所帮助吗?

我不是写入日志的人......我正在读取其他人的滚动日志... - Pure.Krome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接