2012-04-19 260 views
0

我目前正在研究编写一个处理日志文件的程序。目的是日志文件不应超过50MB,所以我正在重命名该文件并创建一个新文件,然后它应该开始写入新文件。为了避免在文件更改时将数据写入日志,我在考虑在程序的一部分中将数据添加到缓冲区,然后在程序的另一部分中读取缓冲区中的数据并将其输出到文件。如果它不能写入文件,它会将它保存在缓冲区中,直到它可以写入文件。将数据写入缓冲区并从缓冲区读取数据

我该如何去做这件事我似乎无法在Google上找到任何东西,不知道我是否在寻找正确的东西。

感谢您的帮助,您可以提供

+0

为什么不让记录仪本身决定何时旋转日志?这样你就没有任何争论。 – 2012-04-19 21:30:24

+1

尝试[log4Net](http://logging.apache.org/log4net/) – 2012-04-19 21:32:40

+0

Log4Net相当不错。 – Sandeep 2012-04-19 21:34:03

回答

1

这听起来像是一个经典的生产者消费者问题。这是很好的起点。

Blocking Collection

正如其他人指出使用库更好,而不是重新发明轮子。 Log4net是一个很好的日志库。

1

我建议使用BlockingCollection。希望写入日志的线程只会将日志字符串排入BlockingCollection。一个单独的线程监视BlockingCollection,将字符串出队并将它们写入文件。如果该文件不可用,该线程可以等待并再次尝试。

有关一些简单示例,请参阅http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

如果您不能使用BlockingCollection,您可以使用Queue并用锁保护它。你的日志记录方法变为:

private Queue<string> myQueue = new Queue<string>(); // owned by the logger 

void WriteLog(string s) 
{ 
    lock (myQueue) 
    { 
     myQueue.Enqueue(s); 
    } 
} 

删除东西的线程可以从队列中获取它们。这将是理想的少一点,因为它必须定期轮询,但它不应该是太糟糕了:

while (!shutdown) // do this until somebody shuts down the program 
{ 
    while (myQueue.Count > 0) 
    { 
     lock (myQueue) 
     { 
      string s = myQueue.Dequeue(); 
      // write the string s to the log file 
     } 
    } 
    Thread.Sleep(1000); // sleep for a second and do it again. 
} 

有办法做到这一点没有忙等待,但我不请记住实施细节。有关示例,请参阅http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspx

+0

这不能用作它的.net 4,我的程序必须是.net 3.5 – Boardy 2012-04-20 14:15:32

+0

@Boardy:查看我更新的答案。 – 2012-04-20 15:40:16