限制Python输出文件大小

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

我知道它的工作原理,但是如果我的文件超出了限制,通过使用File.tell()的组合,然后执行下面的系统命令,将会对我有利?

sed -i '1 d' filename 

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

没有日志系统使用这个策略是有原因的。 您不能删除文件的第一行而不重写整个文件,所以在一个大文件上它非常慢。 另外,在重写文件时,不能将新数据写入文件。

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

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

它似乎你不知道logrotate 。 您正在寻找类似的实施。 看一下这个:

  • 用logrotate创建日志文件
  • Logrotate命令教程

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

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

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

遵循这一切,写入新的数据并关闭文件。 这整个过程必须发生每个日志消息。 祝你好运!

您应该签出Python日志记录模块 ,更具体地说是RotatingFileHandler类。 这可以让你写入一个文件,将有一个固定的大小。 但它不允许在行数上操作。

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