我试图了解python日志记录,并且我有这个:
Main.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')
Bar.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项目,并且希望有一个日志文件以及控制台输出,执行此操作的正确方法是什么?
答案 0 :(得分:1)
问题在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")
或者,您甚至可以根据需要使用相同的名称。这样,分配给更高级别的处理程序将传递到子级别。