Python 将碎片日志输出流到websocket
我正在尝试构建一个API,当通过websocket消息请求时,它将运行一个ScrapyWebSpider 我想将日志输出转发到websocket客户端,这样您就可以看到这个过程中发生了什么——有时运行时间相当长。完成后,我还将发送刮取的结果 因为有可能在进程中运行Scrapy,所以我希望能够做到这一点。我在这里找到了一个将外部进程流式传输到websocket的解决方案,但如果可以在服务器内部运行Scrapy,那么这似乎并不正确 我可以想象有两种方法在Twisted中实现这一点:以某种方式使用LogObserver,或者定义LogHandler(可能是StringIO中的StreamHandler),然后以某种方式在Twisted中使用autobahn.websocket类(如WebSocketServerProtocol)处理流 现在我被卡住了,不知道如何连接两端Python 将碎片日志输出流到websocket,python,websocket,scrapy,twisted,Python,Websocket,Scrapy,Twisted,我正在尝试构建一个API,当通过websocket消息请求时,它将运行一个ScrapyWebSpider 我想将日志输出转发到websocket客户端,这样您就可以看到这个过程中发生了什么——有时运行时间相当长。完成后,我还将发送刮取的结果 因为有可能在进程中运行Scrapy,所以我希望能够做到这一点。我在这里找到了一个将外部进程流式传输到websocket的解决方案,但如果可以在服务器内部运行Scrapy,那么这似乎并不正确 我可以想象有两种方法在Twisted中实现这一点:以某种方式使用L
有人能提供一个简短的示例,说明如何将twisted logging(如果可能,避免使用文件)的日志输出流式传输到websocket客户端吗?我自己设法解决了这个问题,想让您知道我是如何做到的: 其基本思想是拥有一个远程调用的进程,并将流日志输出到客户端(通常是浏览器) 我没有亲自构建所有令人讨厌的细节,而是决定使用和,通过基本上只是WebSocket上的JSON提供pubsub和rpc——这正是我计划构建的,只是更高级而已 下面是一个非常基本的例子:
from twisted.internet.defer import inlineCallbacks
from autobahn.twisted.wamp import ApplicationSession
from example.spiders.basic_spider import BasicSpider
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
import logging
class PublishLogToSessionHandler(logging.Handler):
def __init__(self, session, channel):
logging.Handler.__init__(self)
self.session = session
self.channel = channel
def emit(self, record):
self.session.publish(self.channel, record.getMessage())
class AppSession(ApplicationSession):
configure_logging(install_root_handler=False)
@inlineCallbacks
def onJoin(self, details):
logging.root.addHandler(PublishLogToSessionHandler(self, 'com.example.crawler.log'))
# REGISTER a procedure for remote calling
def crawl(domain):
runner = CrawlerRunner(get_project_settings())
runner.crawl("basic", domain=domain)
return "Running..."
yield self.register(crawl, 'com.example.crawler.crawl')
谢谢你的回答!