我正在编写一个将使用日志文件的应用程序。我想要做的是当应用程序启动它时将检查日志文件是否超过一定大小,如果是,它将从日志文件顶部删除“x”行以缩短它。这样做的好方法是什么?将最新的条目写入文件顶部,然后在删除时从底部删除会更容易吗?
答案 0 :(得分:1)
所以你有一个日志文件,我们称之为“log.log
”
首先,将log.log
移至log.log.bak
。打开它阅读。逐行读取,直到您读取 x 行数。打开一个新文件log.log
进行写作。继续阅读log.log.bak
中的行,并为每行写入log.log
。如果没有其他行,请关闭log.log
和log.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)
还有很多问题尚未解决 -
如果您有C可用,则可以使用fseek(f,0,SEEK_END);long size=ftell(f);
找到文件大小(在打开f后立即)。
如果您需要修剪,可以fseek(f,size-desired_size,SEEK_SET);
然后while (fgetc(f)!='\n') {}
,这会将您带到您相交的行的末尾。
然后将剩余的内容复制到新文件中。
答案 2 :(得分:1)
我不会删除一定数量的行。基本上你必须处理整个文件,如果你这样做,这可能是很多处理。通常的做法是滚动日志文件(将其重命名为其他内容,通常只是附加日期)并重新开始。
另外请记住,文件是一定大小并不能保证在那里有必要的行,在这种情况下你只是以昂贵的方式重命名文件。
当应用启动也从文件顶部开始时,我经常发现它很有用。
答案 3 :(得分:0)
为每种日志保留多个日志文件File1 - FileN。 当每个文件通过一些固定大小时,填写文件File1然后File2,依此类推。 当您填写FileN删除File1并重新开始(删除)并重写File1,File2 ...
这为您提供了一个周期性的固定大小日志。
注意:这需要您跟踪要写入的当前日志文件。这可以存储在单独的日志文件中。