繁体   English   中英

Python记录-记录器错误导入到另一个文件

[英]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),我意识到了明显的问题。 我面临的问题是两个概念的组合:

  1. 从模块导入任何内容时,即使它是单个变量,也将执行所有模块级别的代码。

  2. 对具有相同名称的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM