2

我曾经使用Python 日志记录,它工作正常。设置在logging.basicConfig(...)一个模块(一个some.py文件)中,然后我们可以logging在任何地方使用。显然,日志记录是全球性的。

问题是,当我们不调用 basicConfig(...) 出现的位置(在 some.py 文件中)时,日志记录如何module找到设置?日志记录是否扫描所有包?

即使logging.basicConfig(...)放入一个any.py和模块(any.py)永远不会被导入,或者没有在任何地方使用,日志设置生效

4

2 回答 2

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
于 2012-04-04T07:46:52.740 回答
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.pymain.py.

    我希望你能在你的情况下找到它是从哪里进口的。

于 2012-04-05T05:25:47.450 回答