Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是Python';日志模块的RotatingFileHandler是否将重命名日志文件而不是创建新的日志文件?_Python_Logging - Fatal编程技术网

为什么是Python';日志模块的RotatingFileHandler是否将重命名日志文件而不是创建新的日志文件?

为什么是Python';日志模块的RotatingFileHandler是否将重命名日志文件而不是创建新的日志文件?,python,logging,Python,Logging,我阅读了Python日志模块的handlers.py,发现循环日志的逻辑不合理。下图为其评论: 我认为这种逻辑是不合理的,尤其是在Windows中:如果其他进程持有日志文件的处理程序,那么重命名将失败。例如,我有两个进程,一个进程发现轮换文件的时间到了,所以它关闭自己的处理程序并重命名日志。但这一次,日志文件的处理程序由另一个进程持有,因此将引发IO异常,因为现在无法重命名日志文件。这就是为什么我们说日志模块在多进程中是不安全的 我的问题是:为什么不直接创建另一个日志文件?为什么需要重命名日志

我阅读了Python日志模块的
handlers.py
,发现循环日志的逻辑不合理。下图为其评论:

我认为这种逻辑是不合理的,尤其是在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日志模块的rotatingFileHandler使用my logic,您会发现一些错误吗?

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

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


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

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

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


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

您的建议的主要问题是,实际的日志文件总是在更改(首先是console.log,后面是console.log.1,然后是console.log.2等。)因此,所有将读取日志的程序都必须实现逻辑以查找更新的文件,主要问题是读取日志的软件需要不断扫描日志文件夹,以查找是否创建了新文件并开始从中读取日志。

您的建议的主要问题是,实际的日志文件始终都在变化(首先是console.log,然后是console.log.1,然后是console.log.2等等)因此,所有将读取日志的程序都必须实现逻辑以查找更新的文件,主要问题是读取日志的软件需要不断扫描日志文件夹以查找是否创建了新文件并开始从中读取日志。

谢谢您的回答。但我不认为>这是标准的prac这是一个很好的理由。也许很多年前,写这个逻辑的人喝了很多酒……能够可靠地指向最新的日志文件是一个更好的理由。“我不在乎有多少存档日志文件,我现在就想要最新的。”事实上,我不需要任何额外的逻辑来“查找”最新的日志文件。我需要做的是当当前日志被填满时,创建一个新的日志文件。由于OO编程,高层不会发现rotatingFileHandler使用的逻辑有任何区别。因此,您的理由在两个逻辑中都是正确的。其他程序和脚本读取日志文件,能够可靠地找到最新的日志文件e非常重要。谢谢你的回答。但我不认为>这是多年来的标准做法。这是一个很好的理由。也许很多年前,编写此逻辑的人喝了很多酒……能够可靠地指向最新的日志文件是一个更好的理由。“我不在乎有多少存档日志文件,我现在就想要最新的。”事实上,我不需要任何额外的逻辑来“寻找”最新的日志文件。我需要做的是当当前日志被填满时,创建一个新的日志文件。由于OO编程,高层不会发现rotatingFileHandler使用的逻辑有任何区别。因此,您的理由在两个逻辑中都是正确的。其他程序和脚本读取日志文件,能够可靠地找到最新的日志文件e非常重要。谢谢你的回答。我认为不需要所有程序都实现逻辑,只有rotatingFileHandler类才能实现。Python的逻辑也会在每次写入新信息时检查日志文件是否被填满。因此,我的逻辑不会增加太多的工作开销。@Kingname您需要考虑这一点很多程序都是用很多编程语言编写的,需要读取日志文件,将来,有人(或者你自己)需要从另一个程序(使用另一种编程语言)读取日志需要编写所有逻辑,另一件事是,不断扫描文件夹以查找新文件比简单地读取单个文件要昂贵得多谢谢你的回答。我认为不需要所有程序都实现逻辑,只有rotatingFileHandler类才能实现逻辑。Python的逻辑将检查日志文件是否填满y时间它也会写入新信息。所以我的逻辑不会增加太多的工作开销。@Kingname您需要考虑到,会有很多程序是用很多pro编写的