2009-08-07 53 views
0

我正在编写将使用日志文件的应用程序。我想要做的是当应用程序启动时,它将检查日志文件是否超过特定大小,如果是,它会从日志文件顶部删除“x”行数量以缩短日志文件的大小。这将是一个很好的方式去做这件事?将最新的条目写入文件的顶部,然后在删除时从底部删除会更容易些吗?删除文本文件顶部的x行数

回答

1

所以,你有一个日志文件,姑且称之为 “log.log

首先,移动log.loglog.log.bak。打开它阅读。一行一行阅读,直到阅读完x行数。写一个新文件,log.log。继续阅读log.log.bak中的每行,并将其写入log.log。当没有更多行时,关闭log.loglog.log.bak,然后删除log.log.bak。

一些伪代码:

x = number of lines to delete 

move log.log to log.log.bak 

open log.log.bak for reading 
while i have read < x lines 
    read a line and throw it away 

open log.log for writing 
while there are more lines in log.log.bak 
    read a line from log.log.bak 
    write the line to log.log 

close log.log 
close log.log.bak 

delete log.log.bak 
1

有很多的问题,左开

  1. 什么环境,是你?在Un * x中,您可以简单地'tail -100 input.txt> trimmed.txt'
  2. 您可以将文件加载到内存中,还是会过大?
  3. 你可以使用中间文件吗?
  4. 您有哪些语言可用/您是否熟悉?
  5. 您多久进行一次修整?如果您的写作比修剪更频繁,请写下底部(速度很快)并且很少执行昂贵的修剪操作。

如果您有C可用,您可以找到与fseek(f,0,SEEK_END);long size=ftell(f);(打开f后立即)的文件大小。

如果您需要修剪,可以使用fseek(f,size-desired_size,SEEK_SET);,然后使用while (fgetc(f)!='\n') {},这会将您带到相交线的末端。

然后将剩余的文件复制到新文件中。

1

我不会删除一定数量的行。基本上你必须处理整个文件,如果你这样做,那可能是很多处理。通常的做法是滚动日志文件(将其重命名,通常只添加日期)并重新开始。

还要记住,文件是一定大小不能保证有必要的行,在这种情况下,你只是以昂贵的方式重命名文件。

我经常发现它也适用于应用程序启动时也从文件顶部开始。

0

为每种日志保留几个日志文件File1-FileN。 当每个文件通过一些固定的大小时,填充文件File1然后File2等等。 当你填充FileN删除File1并重新开始(删除)并重写File1,File2 ...

这给你一个周期性的固定大小日志。

注意:这要求您跟踪哪些是要写入的当前日志文件。这可以存储在一个单独的日志文件中。