2011-06-15 154 views
2

我有一个在Debian上运行的Python程序,它使用File对象输出数据。我想对我的文件的大小设置限制,但我不想停止写入文件 - 我只想删除最早的行(位于文件的顶部)。我的数据是随着数据包从客户端到达而随机写入的(想想web日志记录)。限制Python输出文件大小

我知道它的工作原理,但是如果我的文件超出限制,通过使用File.tell()的组合,然后执行下面的系统命令,将它关闭是我最大的兴趣?

sed -i '1 d' filename 

一旦达到大小限制,它会每次执行sed。有没有更好的办法?

回答

2

原因Python的日志记录模块不使用这种策略,因为它需要的性能损失。如果根据大小或年龄旋转的日志文件根本不可接受,那么就像我看到的那样,您有两个基本选择:覆盖日志文件,写入临时文件然后替换。

如果覆盖日志文件,您应该首先选择文件中的整数地址(第一个\ n字节的位置加上一个可能),它将成为'新的零'(称为X)。然后选择一个块大小,也许32K。然后开始计数。寻找到X +块大小*块号,读取一个块。寻求块大小*块号,写回块。读取时到达EOF时,将文件截断为长度块大小*块编号。

如果使用临时文件,请找到'新零',将文件的其余部分复制到临时文件,然后将其重命名为原始名称。比我想的更容易,无论如何更容易解释,但使用更多的空间。

以下所有内容,请写入新数据并关闭文件。每个日志消息都必须执行整个过程。祝你好运!

3

有一个原因,没有日志记录系统使用这种策略。您不能在不重写整个文件的情况下从文件中删除第一行,因此它在大文件上非常缓慢。另外,当你重写文件时,你无法将新数据写入文件。

正常的策略是在当前文件变得太大时开始写入新文件。然后,您可以删除超过阈值的文件。这是其他人提到的“日志轮换”。

如果你真的想创建一个队列,在添加一个新数据的时候删除一行数据,我建议使用数据库。 MongoDB和其他数据库管理器支持数组,但是如果需要,你可以用SQL数据库做类似的事情。

0

除非您需要近实时访问来自另一个进程的文件,否则我可能会将每个日志行写入固定大小的collections.deque。您可以实现一种方法,将collections.deque中的项目(行)同步到日志文件中的行。