【问题标题】:Why Python's RotatingFileHandler of logging module will rename log file instead of create a new one?为什么Python的日志记录模块RotatingFileHandler会重命名日志文件而不是新建一个?
【发布时间】:2016-10-04 15:50:10
【问题描述】:

看了Python的日志模块的handlers.py,发现轮换日志的逻辑不合理。下图是它的cmets:

我认为这种逻辑是不合理的,尤其是在 Windows 中:如果其他一些进程持有日志文件的处理程序,那么重命名将失败。例如,我有两个进程,一个进程发现是时候轮换文件了,所以它关闭了自己的处理程序并重命名了日志。但这一次,日志文件的处理程序被另一个进程持有,因此将引发 IO 异常,因为现在无法重命名日志文件。这就是为什么我们说日志模块在多进程中是不安全的。

我的问题是:为什么不直接创建另一个日志文件?为什么需要重命名日志文件?

假设日志名为console.log,我想逻辑应该是这样的:

if there is not console.log in destination folder:
    create console.log and logging info
else:
    add the suffix to the log file name.(e.g.: console.log.1)
    create the file and logging info

if the log file gets filled up:
    close the handler of the log file
    increase the suffix number
    create console.log.`newsuffix`(e.g.:console.log.2) and continue to logging info

在这个逻辑中,不需要重命名文件,所以不会引发IO Exception。

如果Python的日志模块的rotatingFileHandler使用我的逻辑,你能发现一些bug吗?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    这样console.log 将始终是最新的日志文件,您不需要任何额外的逻辑来查找最新的日志文件。这是多年来的标准做法。

    我知道,至少在 Linux/Unix 上,当一个进程打开一个文件时,它的文件名会被转换为一个 inode 值,并用作参考,而不是文件名。

    之前打开文件的任何进程仍将指向该 inode,直到它们自己的锁被刷新或关闭。考虑到这一点,移动或删除文件对以前打开文件句柄的任何进程都没有任何作用,但其他人将看不到旧文件(至少按文件名)。

    【讨论】:

    • 感谢您的回答。但我不认为 >这是多年来的标准做法。是一个很好的理由。也许很多年前,写这个逻辑的人喝了很多酒......
    • 能够可靠地指向最新的日志文件是一个更好的理由。 “我不在乎有多少归档日志文件,我现在想要最新的。”
    • 事实上,我不需要任何额外的逻辑来“找到”最新的日志文件。我需要做的是当当前日志被填满时,创建一个新日志。
    • 并且由于OO编程,高层不会发现rotatingFileHandler使用哪种逻辑有任何区别。所以你的理由在两个逻辑上都是正确的。
    • 其他程序和脚本读取日志文件,能够可靠地找到最新的日志文件非常重要。
    【解决方案2】:

    您的建议的主要问题是实际的日志文件总是会发生变化(首先是 console.log,后来是 console.log.1,之后是 console.log.2 等等......)所以,所有将读取日志的程序,它们都必须执行逻辑来查找更新的文件,主要问题是读取日志的软件需要不断扫描日志文件夹以查找是否创建了新文件并启动从中读取日志。

    【讨论】:

    • 感谢您的回答。我认为不需要所有程序都实现逻辑,只有 rotationFileHandler 类这样做。 Python 的逻辑也会在每次写入新信息时检查日志文件是否被填满。所以我的逻辑不会增加太多的工作开销。
    • @Kingname 你需要考虑到会有很多用很多编程语言编写的程序需要读取日志文件,在未来,某人(或者你自己)将需要从另一个程序(使用另一种编程语言)读取日志并且需要编写所有逻辑,另一件事是不断扫描文件夹以查找新文件比读取单个文件要昂贵得多
    猜你喜欢
    • 2014-10-21
    • 2016-06-04
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多