gpt4 book ai didi

Python 日志记录模块多次打印行

转载 作者:太空狗 更新时间:2023-10-29 18:17:20 24 4
gpt4 key购买 nike

我有以下代码:

import logging
class A(object):
def __init__(self):
self._l = self._get_logger()

def _get_logger(self):
loglevel = logging.INFO
l = logging.getLogger(__name__)
l.setLevel(logging.INFO)
h = logging.StreamHandler()
f = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
h.setFormatter(f)
l.addHandler(h)
l.setLevel(loglevel)
return l

def p(self, msg):
self._l.info(msg)

for msg in ["hey", "there"]:
a = A()
a.p(msg)

我得到的输出是:

2013-07-19 17:42:02,657 INFO hey
2013-07-19 17:42:02,657 INFO there
2013-07-19 17:42:02,657 INFO there

为什么“there”被打印了两次?同样,如果我在循环中添加另一个 A 类对象并打印一条消息,它会打印三次。

文档说如果记录器的名称匹配,logging.getLogger() 将始终返回相同的记录器实例。在这种情况下,名称确实匹配。它不应该返回相同的记录器实例吗?如果确实如此,为什么会多次打印该消息?

最佳答案

记录器创建一次,但创建多个处理程序。

创建一次A

a = A()
for msg in ["hey", "there"]:
a.p(msg)

或者改变_get_logger如下:

def _get_logger(self):
loglevel = logging.INFO
l = logging.getLogger(__name__)
if not getattr(l, 'handler_set', None):
l.setLevel(loglevel)
h = logging.StreamHandler()
f = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
h.setFormatter(f)
l.addHandler(h)
l.setLevel(loglevel)
l.handler_set = True
return l

更新

自 Python 3.2 起,您可以使用 logging.Logger.hasHandlers查看此记录器是否配置了任何处理程序。 (感谢@toom)

def _get_logger(self):
loglevel = logging.INFO
l = logging.getLogger(__name__)
if not l.hasHandlers():
...
return l

关于Python 日志记录模块多次打印行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17745914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com