gpt4 book ai didi

Python 3 日志记录 : QueueListener + SocketHandler, 第一次清除队列真的很慢

转载 作者:行者123 更新时间:2023-12-05 07:41:47 24 4
gpt4 key购买 nike

在我的 Python 3 代码中,我有一个这样设置的记录器:

class TmpQListener(logging.handlers.QueueListener):
def dequeue(self, block):
print('QSIZE : ' + str(self.queue.qsize())) # only change to the QueueListener
return self.queue.get(block)

log_q = queue.Queue(-1) # unlimited size
logger = logging.getLogger('TestLogger')
socket_handler = logging.handlers.SocketHandler('localhost', 1337)
q_handler = logging.handlers.QueueHandler(log_q)
q_listener = TmpQListener(log_q, socket_handler)
logger.addHandler(q_handler)
q_listener.start()

当我运行我的程序时(接收日志消息的服务器已经启动并正在运行)队列将很快填满。每添加 20-30 条消息,它只会从队列中删除(即发送)2-3 条消息。我的内存将逐渐填满,使程序越来越慢,直到我的 RAM 基本上已满,此时程序会慢下来以爬行并尝试立即清除整个队列(即发送所有内容)。如果它不能足够快地清除所有内容(无论出于何种原因),它将继续变慢直到程序完成。如果它确实设法清除队列并在此时发送基本上是几 GB 的 LogRecords,它将再次加速并按我预期的方式工作,这意味着从这一点开始它将在所有消息发送时立即发送添加到队列而不影响性能。

由于这可能不是预期的行为,我认为我做错了什么。

值得一提的是,我正在使用 LogRecord 的 'extra' arguement发送列表以及我的一些 LogRecords。那些记录调用看起来像这样:

logger.info("PROX_MARKER", extra={'vector': [some_list]})

其中 some_list 是一个包含数千个 double 值的列表,这使得 LogRecord 的大小非常大。我意识到这不完全是日志记录调用的目的,但是我不认为这是一个问题,因为它可以很好地工作if程序设法清除了消息。

我查看了 SocketHandler/QueueHandler/QueueListener 的代码,但找不到任何可以解释此行为的内容。在我的原始代码中,我使用了一个自定义的 SocketHandler 来序列化日志记录。我已经用默认的 SocketHandler 替换了它,但结果是一样的。现在我完全没有想法了。

非常感谢有关如何解决此问题的任何提示。

最佳答案

我的帖子可能来不及了。从你的问题来看,队列容量设置为无限,内存消耗越来越大,那么可能是队列监听无法像日志生产者那样快速清除。可能是由于网络连接速度慢,远程套接字端无法快速清除日志消息。

可能的解决方案是

  1. 设置合理的队列限制并监控未处理的队列大小。对于您的情况,请尝试获得一个合理的值并将您的队列设置为此数字,而不是没有限制。

  2. 检查您的日志消息生成器,注释掉生成的不必要的日志消息。监视未处理的队列大小并根据此调整调整其大小。

  3. 可以考虑使用 MemoryHandler。给你缓存相关日志信息,如果最后有错误,一次性发送。

  4. 将调试级别设置为更高的值。

关于Python 3 日志记录 : QueueListener + SocketHandler, 第一次清除队列真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45141676/

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