如何在Twisted/Autobahn中记录变量或编写向变量发送消息的观察者

2024-04-20 14:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个websocket客户端,它将每隔几秒钟接收更新,利用带有twisted的高速公路。我使用多个观察者成功地记录了数据,但是我想使用接收到的部分消息发送到数据帧(并最终实时绘制)。我的假设是我可以记录到一个变量和一个类似文件的对象,但我不知道如何去做。正确的方法是什么。在

我已经非常彻底地阅读了当前和遗留twisted Logger的文档:

在扭曲.loghttps://twistedmatrix.com/documents/current/core/howto/logging.html
twisted.loggerhttps://twistedmatrix.com/documents/current/core/howto/logger.html

在我的代码中,我尝试使用zope.接口和@providertwisted.logger包来创建一个定制的日志观察者,但是到目前为止,甚至没有一个幸运的定制日志观察者来打印,更不用说向变量发送数据了。在

from twisted.internet import reactor
from autobahn.twisted.websocket import WebSocketClientFactory, WebSocketClientProtocol, connectWS
from twisted.logger import (globalLogBeginner, Logger, globalLogPublisher,
  jsonFileLogObserver, ILogObserver)

import sys
import io
import json

from pandas import DataFrame

def loggit(message):
    log.info("Echo: {message!r}", message=message)



class ClientProtocol(WebSocketClientProtocol):
    def onConnect(self, response):
        print("Server connected: {0}".format(response.peer))

    def initMessage(self):
        message_data = {}
        message_json = json.dumps(message_data)
        print "sendMessage: " + message_json
        self.sendMessage(message_json)

    def onOpen(self):
        print "onOpen calls initMessage()"
        self.initMessage()

    def onMessage(self, msg, binary, df):
        loggit(msg)


    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {0}".format(reason))


if __name__ == '__main__':

    factory = WebSocketClientFactory("wss://ws-feed.whatever.com")
    factory.protocol = ClientProtocol

    @provider(ILogObserver)
    def customObserver(whatgoeshere?):
        print event

    observers = [jsonFileLogObserver(io.open("loga.json", "a")),
     jsonFileLogObserver(io.open("logb.json", "a")), customObserver(Whatgoeshere?)]

    log = Logger()

    globalLogBeginner.beginLoggingTo(observers)



    connectWS(factory)
    reactor.run()

Tags: fromioimportselfcomjsonmessagedef
1条回答
网友
1楼 · 发布于 2024-04-20 14:17:34

日志观察者只是一个可调用的对象,它接受一个字典,其中包含作为日志消息一部分的所有值。在

这意味着您可以拥有一个用@zope.interface.implementer(ILogObserver)修饰的__call__方法的类实例,或者用@zope.interface.provider(ILogObserver)修饰的函数来执行该角色。在

下面是一些代码的示例,它将一些值记录到一个文本文件、一个JSON文件和一个内存中的统计信息采集器中,该收集器可以动态地进行汇总。在

import io
from zope.interface import implementer
from twisted.logger import (globalLogBeginner, Logger, jsonFileLogObserver,
                            ILogObserver, textFileLogObserver)

class Something(object):
    log = Logger()

    def doSomething(self, value):
        self.log.info("Doing something to {value}",
                      value=value)

@implementer(ILogObserver)
class RealTimeStatistics(object):
    def __init__(self):
        self.stats = []

    def __call__(self, event):
        if 'value' in event:
            self.stats.append(event['value'])

    def reportCurrent(self):
        print("Current Sum Is: " + repr(sum(self.stats)))

if __name__ == "__main__":
    stats = RealTimeStatistics()
    globalLogBeginner.beginLoggingTo([
        jsonFileLogObserver(io.open("log1.json", "ab")),
        textFileLogObserver(io.open("log2.txt", "ab")),
        stats, # here we pass our log observer
    ], redirectStandardIO=False)
    something = Something()
    something.doSomething(1)
    something.doSomething(2)
    something.doSomething(3)
    stats.reportCurrent()

相关问题 更多 >