我需要读取.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