python日志如何获得它的配置

时间:2012-04-04 06:34:02

标签: python logging

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

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

即使logging.basicConfig(...)放入any.py而模块(any.py)也从未导入或未在任何地方使用,日志记录设置生效

2 个答案:

答案 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

    我希望你会在你的案例中找到从哪里导入。