2011-04-13 63 views
3

我测试了用于Python的日志记录模块一些简单的日志记录的例子在IDLE:为什么IDLE在再次运行时不会创建带日志记录模块的新日志文件?

import logging 

logging.basicConfig(level=logging.DEBUG, 
    format='%(asctime)s %(levelname)s %(message)s', filename='TESTLOG.log') 

logging.debug('A debug message') 

而且它按预期工作:与调试信息创建一个名为TESTLOG.log的文件。

但是,如果我在IDLE脚本窗口打开时删除日志文件,当我尝试再次运行模块/ f5时,不会创建新的日志文件。如果关闭脚本窗口,然后重新打开并运行它,则会创建日志文件。相反,如果我从命令行运行脚本,日志文件总是在我删除日志文件并重新运行脚本后生成的。

这两种情况有什么区别?

回答

1

第一次调用basicConfig时,它将Handler添加到logging模块的根记录器中。随后调用basicConfig检查以查看根记录器中是否已有处理程序,如果有,则对basicConfig的调用不起作用(即不会重新创建日志文件)。

如果您打开一个IDLE窗口并运行脚本,则会加载日志记录模块,脚本会通过basicConfig的调用来配置根日志记录器。因为您之后没有关闭IDLE窗口,所以日志记录模块保持加载状态,随后对basicConfig的调用不起作用。

关闭并重新打开IDLE窗口会有效启动python的新实例,并且必须重新加载日志记录模块,因此对basicConfig的调用会产生影响。同样,从命令行运行脚本需要在每次脚本运行时新建一个python实例。

+0

谢谢。这是有道理的,并帮助我更好地理解日志记录模块。 – monkeylytics 2011-04-15 17:24:14

0

你不说你正在使用什么操作系统,但我想这不是Windows,因为你不能删除Windows中打开的文件。在Linux上,打开文件可以删除,但该文件挂起,直到所有打开的句柄关闭,然后消失。这看起来与您看到的一致:在IDLE情况下,只要IDLE正在运行,文件就会保持打开状态,因此即使删除了文件,文件仍然存在,直到IDLE进程终止。在脚本的情况下,它们每次都会终止,因此文件被关闭,当您删除它时,它真的被删除。

相关问题