首页 > 解决方案 > Python 记录器混淆

问题描述

我试图了解 python 日志记录,我有这个:

主要.py

import logging
from Foo import Foo

logging.basicConfig(level=logging.DEBUG)

fh_formatter = logging.Formatter('[%(asctime)s : %(levelname)s : %(name)s] : %(message)s')
file_handler = logging.FileHandler('logger.log', mode='w')
file_handler.setFormatter(fh_formatter)
file_handler.setLevel(logging.DEBUG)

sh_formatter = logging.Formatter('%(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(sh_formatter)
stream_handler.setLevel(logging.DEBUG)

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.info('Running main')
Foo().print_foo()

foo.py

import logging
from Bar import Bar

logger = logging.getLogger(__name__)

class Foo():

    def print_foo(self):
        Bar().print_bar()
        logger.info('Inside Foo.foo')

酒吧.py:

import logging

logger = logging.getLogger(__name__)

class Bar():

    def print_bar(self):
        logger.info('Inside Bar.bar')

当我运行代码时,在控制台上我看到了这个输出

Running main
INFO:__main__:Running main
INFO:Bar:Inside Bar.bar
INFO:Foo:Inside Foo.foo

但是当我检查时logger.log,我只看到一行

[2019-03-23 18:46:01,276 : INFO : __main__] : Running main

我怎样才能让我看到这两个地方的所有线条?我是否需要为每个文件中的每个记录器设置文件处理程序和流处理程序?如果我有一个 python 项目,并且我想要一个日志文件以及控制台输出,那么正确的方法是什么?

标签: python-3.xloggingfilehandler

解决方案


问题出在 Foo 和 Bar 的这一行:

logger = logging.getLogger(__name__)

请注意,您只重置了 中的日志记录处理程序Main.py,记录器名称为,如您在输出中看到的那样__name__解析为。"__main__"当您从 获取记录器时Foo.py,您的记录器名称是"Foo",因此您设置的所有内容都"__main__"不会应用。

你想做的事:改变__name__零件。例如,您的应用程序被调用,fubar然后您执行以下操作Main.py

logger = logging.getLogger("fubar")

在 中Foo.py,作为应用程序中的子模块,执行以下操作:

logger = logging.getLogger("fubar.Foo")

或者,如果您愿意,您甚至可以使用相同的名称。这样,分配在更高级别的处理程序将传递到子级别。


推荐阅读