我曾经 Python记录,它运行正常。 logging.basicConfig(...)
在一个模块(some.py
文件)中设置,然后我们可以在每个地方使用logging
。显然,记录是全球性的。
问题是当我们没有调用出现 basicConfig(...)的module
时( some.py 文件中),日志记录如何找到它的设置)?是否记录扫描所有包?
即使logging.basicConfig(...)
放入any.py
而模块(any.py
)也从未导入或未在任何地方使用,日志记录设置生效!
答案 0 :(得分:4)
要了解日志记录,您已深入了解Python的标准库源。
这是诀窍:
#/usr/lib/python3.2/logging/__init__.py
...
root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)
...
# and
def basicConfig(**kwargs):
...
hdlr = StreamHandler(stream)
fs = kwargs.get("format", BASIC_FORMAT)
dfs = kwargs.get("datefmt", None)
style = kwargs.get("style", '%')
fmt = Formatter(fs, dfs, style)
hdlr.setFormatter(fmt)
root.addHandler(hdlr)
因此,当您使用某些参数调用basicconfig()
时,会设置root
记录器。
最后getLogger
:
def getLogger(name=None):
"""
Return a logger with the specified name, creating it if necessary.
If no name is specified, return the root logger.
"""
if name:
return Logger.manager.getLogger(name)
else:
return root
答案 1 :(得分:2)
我认为这里没有神奇的扫描。
尝试在单独的test
目录中以这种方式进行测试:
test/main.py:
import logging
logging.info('test')
test/any.py:
import logging
logging.basicConfig(filename='test.log', level=logging.INFO)
python main.py
结果:否test.log
档案。
现在让我们更新测试:
test/main.py:
import logging
import any
logging.info('test')
python main.py
结果新test.log
个文件中包含INFO:root:test
字符串。
所以我猜你的案例any.py
是以某种方式导入的,
尽管你的期望。
您可以轻松找到导入any.py
的方式,
只需在那里添加几行:
test/any.py:
from traceback import print_stack
print_stack()
...
python main.py
<强>结果:强>
File "main.py", line 2, in
import any
File "any.py", line 2, in
print_stack()
此堆栈显示从any.py
导入main.py
。
我希望你会在你的案例中找到从哪里导入。