Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在.NET中读取滚动日志文件的最佳方法?_File_Logging_.net 3.5 - Fatal编程技术网

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

File 在.NET中读取滚动日志文件的最佳方法?,file,logging,.net-3.5,File,Logging,.net 3.5,我需要在.NET3.5sp1中读取滚动日志文件。我想知道最好的方法是什么?文件可能会变得很大。我的一个想法是 打开文件 将文件读取到最后一个读取行(在第一种情况下为0) 阅读所有剩余的行 关闭流并记住最后读取的行号 等等 冲洗/重复 考虑到文件可能相当大,我不确定这是否是最好的方法,并且对于内存来说是有效的。我也无法锁定日志文件:( 想法?下面是一个使用文件系统监视程序打开文件并在写入时读取新数据的示例: 这个例子看起来不错,但不要因为Pete和all things的喜爱而使用lock(这

我需要在.NET3.5sp1中读取滚动日志文件。我想知道最好的方法是什么?文件可能会变得很大。我的一个想法是

  • 打开文件
  • 将文件读取到最后一个读取行(在第一种情况下为0)
  • 阅读所有剩余的行
  • 关闭流并记住最后读取的行号
  • 等等
  • 冲洗/重复
考虑到文件可能相当大,我不确定这是否是最好的方法,并且对于内存来说是有效的。我也无法锁定日志文件:(


想法?

下面是一个使用文件系统监视程序打开文件并在写入时读取新数据的示例:

这个例子看起来不错,但不要因为Pete和all things的喜爱而使用lock(这个)。这是不好的。使用一个新对象,你可以在类中的所有对象之间共享


如果以只读方式打开文件,则根据附加到日志文件的程序打开文件的方式,您不应存在共享冲突。

获取文件长度并读取文件的最后一部分。不难找到第一个换行符并从此处显示所有内容。FileStream有一个
length
属性,即nd
read
方法允许您从一个地方读取到另一个地方


Steven是对的。如果另一个程序不需要独占访问,您可以以只读方式打开,这样就可以了。

您可以只附加到文件中,而不是跟踪您所在的位置吗

    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();
        }
    }
否则,如果您有一个写入程序在某个点写入而其他东西正在消耗,并且您没有锁定,那么您的程序损坏您的日志。这甚至不是问题。您可以尝试通过让任何想要读取或写入文件的人以独占方式打开该文件来锁定该文件,但另一个则会de无法读取时将抛出异常


如果日志文件在同一个程序中,您可以将所有信息保存在一个大的流中,如MemoryStream,并使用上面提到的StreamWriter(或以及)到MemoryStream。然后,您的读者和作者可以锁定MemoryStream,而不是文件本身。这会有帮助吗?

我不是向日志写入的人……我正在从其他人那里读取滚动日志。。。