为什么Python的日志记录模块的RotatingFileHandler会重命名日志文件而不是创建新文件?

时间:2016-10-04 15:50:11

标签: python logging

我已经阅读了Python的日志记录模块handlers.py,发现旋转日志的逻辑是不合理的。以下图片是其评论: enter image description here

我认为这种逻辑是不合理的,尤其是在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异常。

如果Python的日志记录模块的rotateFileHandler使用我的逻辑,你能找到一些错误吗?

2 个答案:

答案 0 :(得分:1)

这样size_t len; char cstr[] = "char string"; signed char scstr[] = "signed char string"; unsigned char ucstr[] = "unsigned char string"; len = strlen(cstr); len = strlen(scstr); /* warns when char is unsigned */ len = strlen(ucstr); /* warns when char is signed */ 始终是最新的日志文件,您不需要任何额外的逻辑来查找最新的日志文件。这是多年来的标准做法。

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

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

答案 1 :(得分:1)

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