[英]Python Logging - Logger erroneously gets imported to another file
我有两个Python脚本(test1.py,test2.py)初始化了自己的记录器。 test2.py从test1.py导入单个变量。 但是奇怪的是,来自test1.py的记录器也被自动导入到test2.py中。
test1.py
import logging
import logging.handlers
LOG_FILENAME = '1.log'
rootLogger = logging.getLogger("default")
rootLogger.setLevel(logging.DEBUG)
# Set up a specific logger with our desired output level
consoleHandler = logging.StreamHandler()
rootLogger.addHandler(consoleHandler)
# Add the log message handler to the logger
handler = logging.FileHandler( LOG_FILENAME)
rootLogger.addHandler(handler)
a = 1
b = 2
test2.py
import logging
import logging.handlers
LOG_FILENAME = '2.log'
rootLogger = logging.getLogger("default")
rootLogger.setLevel(logging.DEBUG)
# Set up a specific logger with our desired output level
consoleHandler = logging.StreamHandler()
rootLogger.addHandler(consoleHandler)
# Add the log message handler to the logger
handler = logging.FileHandler( LOG_FILENAME)
rootLogger.addHandler(handler)
a = 3
from test1 import b
rootLogger.debug("a:%s",a)
rootLogger.debug("b:%s",b)
现在,当我运行test2.py时,我希望仅应调用test2.py中的rootLogger。 更重要的是,我希望仅写入2.log
。 但是奇怪的是,除了控制台上的重复输出外,还生成了1.log
。
$ python test2.py
a:3
a:3
b:2
b:2
$ cat 1.log
a:3
b:2
为什么会这样,以及避免这种情况的最佳实践是什么。
更新资料
我更改了getLogger调用,以区分不同的记录器。
rootLogger = logging.getLogger(__name__)
但是即使这样,“ 1.log”文件仍会创建,但是这次它仍然为空。
我了解,理想情况下,我不应该将rootLogger声明为全局变量,但是随后我将必须将rootLogger处理函数传递给所有函数调用。
稍后发表一些评论(感谢@schwobaseggl),我意识到了明显的问题。 我面临的问题是两个概念的组合:
从模块导入任何内容时,即使它是单个变量,也将执行所有模块级别的代码。
对具有相同名称的getLogger()的多次调用将始终返回对同一Logger对象的引用。 https://docs.python.org/2/library/logging.html
所以基本上,由于我在两个脚本中都使用了相同的记录器名称,并且依次运行了这两个脚本的global module code
,所以我不小心在同一记录器上两次添加了不同的FileHandler。
解
if __name__ == '__main__':
块,请始终放置记录器初始化代码。
import logging
import logging.handlers
a = 1
b = 2
if __name__ == '__main__':
LOG_FILENAME = '1.log'
rootLogger = logging.getLogger(__name__)
rootLogger.setLevel(logging.DEBUG)
# Set up a specific logger with our desired output level
consoleHandler = logging.StreamHandler()
rootLogger.addHandler(consoleHandler)
# Add the log message handler to the logger
handler = logging.FileHandler( LOG_FILENAME)
rootLogger.addHandler(handler)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.