使用Python日志记录模块时重复日志控制台

时间:2013-07-24 17:44:08

标签: python logging

我试图解决这个问题3个小时。请问你能告诉我什么是错的?这些是我的代码

import urllib
from jin import HtmlMigrate
from bs4 import BeautifulSoup
import logging
list2=[]
logging.basicConfig( format='%(levelname)s:%(message)s', level=logging.INFO)
current = 1
source =""
for v in range(13960581, 13960585):
    list=[]
    try:
        fil = urllib.urlopen(source+str(v))
        fill = fil.read()
        soup = BeautifulSoup(fill)
        k = soup.find("div", "post-taglist")
        for i in k.findAll("a"):
            list.append(i.string)
    except AttributeError:
        pass
    if "python" in list:
        try:
            a = soup.find( "div", "post-text")
            list2.append(a)
            logging.info("%s question localized." % str(current))

        except AttributeError:
            pass

    current +=1
mig = HtmlMigrate()

out = file("stackover.html", "w")
for i in list2:
    mig.run(i, out)


out.close()

问题是我在每个logger.info调用的控制台中都有重复的条目。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

这是我的准备:你看到重复的日志条目。相反,因为您的日志记录调用处于循环中,所以您会看到对logging.info的不同调用。

(dis)确认这一点的一种方法是将您的日志记录调用更改为包含v

logging.info("[%s] %s question localized." % (v, str(current)))

让我们知道输出结果如何。


编辑:OP已经证实了我的理论;这个答案已经不复存在了。

答案 1 :(得分:0)

此材料来自日志模块的标准文档,讨论logging.basicConfig

的使用
  

注意:在启动其他线程之前,应该从主线程调用此函数。在2.7.1和3.2之前的Python版本中,如果从多个线程调用此函数,则可能(在极少数情况下)将处理程序多次添加到根记录器,从而导致意外结果(如消息)被复制在日志中。

如果从主程序线程以外的某个线程调用它,则可能是问题所在。我知道这应该是一个评论,但我没有足够的声誉。

答案 2 :(得分:0)

使用

logging.info()来电之前设置断点
import pdb; pdb.set_trace()

当您点击断点并处于pdb提示符时,请键入

p logging.getLogger().handlers

您应该会看到仅使用一个元素打印的列表 - StreamHandler。如果情况并非如此,那么这就解释了为什么你要为一次logging.info()电话获得多行。