【问题标题】:How to Log to a variable or write observer that sends messages to variable in Twisted / Autobahn如何记录到变量或编写将消息发送到 Twisted / Autobahn 中的变量的观察者
【发布时间】:2015-08-18 12:11:54
【问题描述】:

我正在编写一个 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()

【问题讨论】:

    标签: python logging twisted observers autobahn


    【解决方案1】:

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

    这意味着您可以拥有一个带有__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()
    

    【讨论】:

    • 这有很大帮助。感谢您花时间帮助陌生人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2014-04-28
    • 2012-02-09
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多