python3.5中的Asyncio使用INFO进行垃圾邮件

时间:2015-12-28 22:24:08

标签: python python-asyncio

当我在Python 3.5中启用asyncio调试时,我几乎每秒都会得到这样的消息:

INFO:asyncio:poll 999.470 ms took 1001.159 ms: timeout
INFO:asyncio:poll 999.264 ms took 1001.092 ms: timeout
INFO:asyncio:poll 999.454 ms took 1001.059 ms: timeout

这是一个重现此问题的最小代码:

import asyncio
import logging
logging.basicConfig(level=logging.DEBUG)
loop = asyncio.get_event_loop()
loop.set_debug(True)

async def f(delay):
    for i in range(10):
        await asyncio.sleep(delay)

loop.run_until_complete(f(0.5))
# (nothing printed)
loop.run_until_complete(f(1))
# INFO:asyncio:poll 999.470 ms took 1001.159 ms: timeout
# INFO:asyncio:poll 999.264 ms took 1001.092 ms: timeout
# INFO:asyncio:poll 999.454 ms took 1001.059 ms: timeout
# ...
loop.run_until_complete(f(2))
# INFO:asyncio:poll 1999.427 ms took 2001.112 ms: timeout
# INFO:asyncio:poll 1999.393 ms took 2001.088 ms: timeout
# INFO:asyncio:poll 1999.709 ms took 2001.758 ms: timeout
# ...

如果sleep延迟小于1秒,则不会打印消息,但如果> = 1则不会打印消息。

这是预期的行为吗?我怎么能避免这样的消息?

使用Muffin framework时发现了这个问题。

2 个答案:

答案 0 :(得分:5)

您可以为asyncio模块设置日志记录级别,例如:

logging.getLogger('asyncio').setLevel(logging.WARNING)  # Remove asyncio debug and info messages, but leave warnings.

BTW,read about日志名称系统一般:

  

name可能是一个以句点分隔的层次值,例如   foo.bar.baz(例如,它也可能只是普通foo)。   分层列表中较低位的记录器是   记录器在列表中更高。例如,给定一个带有名称的记录器   foo的{​​{1}},名称为foo.barfoo.bar.bazfoo.bam的记录器   foo的所有后代。记录器名称层次结构类似于   Python包层次结构,如果你组织你的相同   基于每个模块的记录器使用推荐的结构   logging.getLogger(__name__)。那是因为在一个模块中,__name__是   Python包命名空间中的模块名称。

答案 1 :(得分:4)

  

这是预期的行为吗?

是的,请参阅https://github.com/python/cpython/blob/v3.6.1/Lib/asyncio/base_events.py#L1372

  

如何避免此类消息?

显然,一种方法是禁用日志记录。或者您只能打印logging.DEBUG级别。或者您可以编写某种custom filter来过滤掉这些消息。