如何制作最大尺寸的日志文件?

时间:2009-05-18 11:01:26

标签: .net

我正在使用FileStream.Write()登录文件。当文件达到最大大小时,我想从文件的开头删除一堆日志。这样做的最佳方式是什么?

我到目前为止最好的想法是创建第二个文件。将我想要保留的所有内容从原始文件写入其中。然后删除原始文件,并使用原始文件名重命名第二个文件。

我能做到这么简单有效吗?

6 个答案:

答案 0 :(得分:7)

使用log4net库 - 它允许滚动日志文件,每个文件的最大大小和最大文件数。

http://logging.apache.org/log4net/index.html

答案 1 :(得分:3)

是,否;;)

哪个对您很重要:效率还是愚蠢?

更高效:传统的滚动日志是固定大小的记录。您在读/写模式下使用随机访问文件,跟踪当前记录指针,当当前记录== max记录时将当前记录设置回零。显然,这限制了您可以记录的内容... DB在“原始磁盘”上执行此操作以使它们能够随机访问变量记录大小。这还需要自定义日志阅读器应用程序。 Yeck!

更简单(并且比从文件到文件复制数千行更有效):编写许多但更小的日志文件。定期“滚动”日志文件,或者当它达到一定大小时...即启动一个新的日志文件,如果numLogs == maxLogs则删除最旧的日志文件。

干杯。基思。

答案 2 :(得分:1)

如果最大尺寸不是太大,您可以将整个文件加载到内存中,删除要删除的部分,然后直接覆盖旧文件。

答案 3 :(得分:1)

这听起来像是一种公平的方式。由于在大多数文件系统上不能直接“截断”文件的开头,因此您将被迫以某种方式重写所有数据。你的两个选择基本上是:

  1. 读取现有日志,将其存储到内存中,然后覆盖整个文件,将初始部分切掉。如果在此过程中发生错误(或者由于某种原因OS /程序意外崩溃),则可能会丢失数据。

  2. 建议的创建新文件然后删除旧文件的方法。这样做的另一个好处是,如果在创建新的时候出现问题,那么旧的仍旧存在且完好无损。

  3. 看起来你似乎想要使用第二种方法。

答案 4 :(得分:1)

我认为您应该将日志文件视为ring buffer。当然,因为线条可能有不同的长度,有时你肯定会有半条线 - 你可能会考虑将它们消隐。

我真的不会考虑每次新线路都重写整个文件 - 非常昂贵。也许您甚至应该使用log4net或查看源代码以了解它们是如何做到的。

答案 5 :(得分:0)

如果尺寸不一定精确,可能更容易计算线?当达到最大值时,返回到开头并删除所有内容,包括换行符。然后回到最后。

当然,如果你根本没有做任何文件写入,直到程序结束,你写完所有的缓存行,那就更容易了。虽然,如果您的程序运行很长时间并且您希望在运行期间看到日志或者类似的东西,这可能是不可行的。