如何在 Twisted / Autobahn 中记录到变量或编写向变量发送消息的观察者
How to Log to a variable or write observer that sends messages to variable in Twisted / Autobahn
我正在编写一个 websocket 客户端,它将每隔几秒左右接收一次更新,利用带有扭曲的高速公路。我使用多个观察者成功记录了数据,但是我想使用我收到的部分消息发送到数据框(并最终实时绘制)。我的假设是我可以记录到一个变量以及一个类似文件的对象,但我不知道该怎么做。实现这一目标的正确方法是什么。
我已经非常彻底地阅读了当前和旧版扭曲记录器的文档:
twisted.log https://twistedmatrix.com/documents/current/core/howto/logging.html
twisted.logger https://twistedmatrix.com/documents/current/core/howto/logger.html
在我的代码中,我尝试使用新 twisted.logger 包中引用的 zope.interface 和 @provider 来创建自定义日志观察器,但到目前为止我什至没有运气自定义日志观察器来打印,更不用说甚至将数据发送到变量。
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()
日志观察器只是一个可调用对象,它采用包含日志消息一部分的所有值的字典。
这意味着您可以拥有一个 class 的实例,该实例带有一个 __call__
方法并装饰有 @zope.interface.implementer(ILogObserver)
,或者一个函数装饰有 @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()
我正在编写一个 websocket 客户端,它将每隔几秒左右接收一次更新,利用带有扭曲的高速公路。我使用多个观察者成功记录了数据,但是我想使用我收到的部分消息发送到数据框(并最终实时绘制)。我的假设是我可以记录到一个变量以及一个类似文件的对象,但我不知道该怎么做。实现这一目标的正确方法是什么。
我已经非常彻底地阅读了当前和旧版扭曲记录器的文档:
twisted.log https://twistedmatrix.com/documents/current/core/howto/logging.html
twisted.logger https://twistedmatrix.com/documents/current/core/howto/logger.html
在我的代码中,我尝试使用新 twisted.logger 包中引用的 zope.interface 和 @provider 来创建自定义日志观察器,但到目前为止我什至没有运气自定义日志观察器来打印,更不用说甚至将数据发送到变量。
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()
日志观察器只是一个可调用对象,它采用包含日志消息一部分的所有值的字典。
这意味着您可以拥有一个 class 的实例,该实例带有一个 __call__
方法并装饰有 @zope.interface.implementer(ILogObserver)
,或者一个函数装饰有 @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()