【问题标题】:How many file descriptors does a RotatingFileHandler logger in python open?python中的RotatingFileHandler记录器打开了多少个文件描述符?
【发布时间】:2015-03-22 14:27:30
【问题描述】:

假设我使用 RotatingFileHandler 使用 python 创建了一个旋转文件记录器。我将文件数设置为 10,每个文件大小设置为 1 MB。我的问题与轮换是如何发生的有关。是否通过保持所有 10 个文件打开并确保每个文件的内容在将一行添加到最新文件时进行修改来进行轮换?如果是这样,那么应该至少有 10 个文件描述符始终处于打开状态。

假设每个文件有 100 KB 块行,所以每个文件只有 10 行。因此,当通过此旋转日志处理程序插入另一行(100 KB)时,每个文件的最后一行不会放在下一个文件的顶部(从新到旧)吗?所以保持所有文件描述符一直打开是有意义的,不是吗?

【问题讨论】:

    标签: python logging log-rotation


    【解决方案1】:

    处理程序只有一个打开的文件。其他文件在旋转时重命名

    首先,关闭当前文件。然后,旋转以相反的顺序重命名文件;所以扩展名为.9的文件首先被重命名为.10,如果已经存在.10,则删除它。然后将.8 重命名为.9 等。最后,将“当前”文件重命名为附加.1 扩展名。

    根据delay 标志,最后会打开一个新文件,无论是在旋转时还是在要写入下一个日志条目时。

    这都是included in the logging.handlers.RotatingFileHandler() documentation

    当即将超过大小时,关闭文件并静默打开一个新文件以进行输出。 [...] 如果 backupCount 不为零,系统将通过在文件名后附加扩展名“.1”、“.2”等来保存旧日志文件。例如,如果 backupCount 为 5,基本文件名为 app.log,您将获得 app.logapp.log.1app.log.2,直至 app.log.5。写入的文件始终为app.log。当这个文件被填满后,关闭并重命名为app.log.1,如果存在app.log.1app.log.2等文件,则分别重命名为app.log.2app.log.3等。

    【讨论】:

    • 谢谢,如果我不为此旋转文件处理程序调用 Logger.removeHandler(..),你能告诉我会发生什么吗?对于打开的文件描述符,垃圾回收最终会发生吗?
    • @P.Prasad: 是的,如果没有其他引用处理程序的对象,连同它持有的打开文件对象一起被清除。
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多