- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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 替换了它,但结果是一样的。现在我完全没有想法了。
非常感谢有关如何解决此问题的任何提示。
最佳答案
我的帖子可能来不及了。从你的问题来看,队列容量设置为无限,内存消耗越来越大,那么可能是队列监听无法像日志生产者那样快速清除。可能是由于网络连接速度慢,远程套接字端无法快速清除日志消息。
可能的解决方案是
设置合理的队列限制并监控未处理的队列大小。对于您的情况,请尝试获得一个合理的值并将您的队列设置为此数字,而不是没有限制。
检查您的日志消息生成器,注释掉生成的不必要的日志消息。监视未处理的队列大小并根据此调整调整其大小。
可以考虑使用 MemoryHandler。给你缓存相关日志信息,如果最后有错误,一次性发送。
将调试级别设置为更高的值。
关于Python 3 日志记录 : QueueListener + SocketHandler, 第一次清除队列真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45141676/
我正在使用 SocketHandler 实现 python logging 模块来记录来自多台远程计算机的消息。 客户端部分: ...... if self.loggerHost ==
我有一个在 514 端口工作的 Syslog 服务器(接收日志事件并存储在文件中)。Syslog服务器运行良好,因为通过路由器进行了测试,配置了路由器的Syslog服务器的IP和端口,并且路由器将日志
在我的 Python 3 代码中,我有一个这样设置的记录器: class TmpQListener(logging.handlers.QueueListener): def dequeue(s
如何从套接字句柄获取关联的 sockaddr_in 以便从中获取端口和地址?或者还有其他关于如何从 SocketHandle 获取 IP 和端口的信息吗? 例如: function GetSocket
我的 Web 应用程序在多个 Apache 实例上运行,因此我遇到了多进程日志记录问题。我目前正在使用 SocketHandler 登录到使用 SocketServer 的守护进程,然后将日志写入单个
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
做一些天真的事情,比如: SocketHandler socketHandler=new SocketHandler(host,service); socketHandler.setLevel(Lev
我是一名优秀的程序员,十分优秀!