导入模块时发生奇怪的事情
我不想把这个问题放在这个标题上,但我实际上不知道发生了什么,所以就这样吧。
我正在做另一个项目,我想在其中使用日志记录模块。该代码分布在几个文件和文件中。我没有为单独的文件创建单独的记录器对象,而是考虑创建一个包含内容的logs.py
import sys, logging
class Logger:
def __init__(self):
formatter = logging.Formatter('%(filename)s:%(lineno)s %(levelname)s:%(message)s')
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setFormatter(formatter)
self.logger=logging.getLogger('')
self.logger.addHandler(stdout_handler)
self.logger.setLevel(logging.DEBUG)
def debug(self, message):
self.logger.debug(message)
,并像(在不同的文件中)一样使用此类。
import logs
b = logs.Logger()
b.debug("Hi from a.py")
- 我剥离了整个问题,在这里提出问题。现在,我有 3 个文件,a.py、b.py 和main.py。所有 3 个文件都会实例化 messages.Logger 类并打印调试消息。
- a.py & b.py 导入“日志”并打印它们的调试消息。
- main.py 导入日志,a & b;并打印它自己的调试消息。
文件内容如下: https://i.sstatic.net/a4ssr.png
< strong>为什么 b.py 的调试消息打印了 2 次&来自 main.py 3 次?
I hate to give the question this heading but I actually don't know whats happening so here it goes.
I was doing another project in which I wanted to use logging module. The code is distributed among few files & instead of creating separate logger objects for seperate files, I thought of creating a logs.py with contents
import sys, logging
class Logger:
def __init__(self):
formatter = logging.Formatter('%(filename)s:%(lineno)s %(levelname)s:%(message)s')
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setFormatter(formatter)
self.logger=logging.getLogger('')
self.logger.addHandler(stdout_handler)
self.logger.setLevel(logging.DEBUG)
def debug(self, message):
self.logger.debug(message)
and use this class like (in different files.)
import logs
b = logs.Logger()
b.debug("Hi from a.py")
- I stripped down the whole problem to ask the question here. Now, I have 3 files, a.py, b.py & main.py. All 3 files instantiate the logs.Logger class and prints a debug message.
- a.py & b.py imports "logs" and prints their debug message.
- main.py imports logs, a & b; and prints it own debug message.
The file contents are like this: https://i.sstatic.net/a4ssr.png
Why is debug message from b.py printed 2 times & from main.py 3 times?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
指定记录器的名称,否则您始终使用根记录器。
http://docs.python.org/howto/logging.html#advanced -日志记录教程:
Specify a name for the logger, otherwise you always use root logger.
http://docs.python.org/howto/logging.html#advanced-logging-tutorial :
logging.getLogger('')
每次调用它时都会返回完全相同的对象。因此,每次实例化一个 Logger(为什么在这里使用旧式类?)时,您都会附加一个处理程序,从而导致打印到另一个目标。由于所有目标都指向同一事物,因此对.debug()
的最后一次调用将打印到指向sys.stdout< 的三个
StreamHandler
对象中的每一个。 /code> 导致打印三行。logging.getLogger('')
will return exactly the same object each time you call it. So each time you instantiate aLogger
(why use old-style classes here?) you are attaching one more handler resulting in printing to one more target. As all your targets pointing to the same thing, the last call to.debug()
will print to each of the threeStreamHandler
objects pointing tosys.stdout
resulting in three lines being printed.第一的。不要创建您自己的
Logger
类。只需使用现有的日志记录配置工具配置现有的记录器类即可。
第二。每次创建自己的 Logger 类时,您还会创建新的处理程序,然后将新的(复制的)处理程序附加到根记录器。这会导致消息重复。
如果您有多个模块必须 (1) 独立运行并且 (2) 还作为较大的复合应用程序的一部分运行,则您需要执行此操作。这将确保日志记录配置仅完成一次。
First. Don't create your own class of
Logger
.Just configure the existing logger classes with exising
logging
configuration tools.Second. Each time you create your own class of
Logger
you also create new handlers and then attach the new (duplicating) handler to the root logger. This leads to duplication of messages.If you have several modules that must (1) run stand-alone and (2) also run as part of a larger, composite, application, you need to do this. This will assure that logging configuration is done only once.