1

如何从来宾工作人员那里捕获输出/日志和/或调试它?worker 是一个常规的 Python3 Autobahn WAMP 组件。无论我写什么printraise写什么,stderr都无处可寻;或者我不知道在哪里看。仅当来宾因错误而终止时,才会将任何内容输出到 Crossbar 日志。这是配置:

workers:
  - type:       guest
    executable: python3
    arguments:  ['../foo.py']
    options:
      stdout: log
      stderr: log

stdout选项stderr似乎没有任何区别。

版本:

  • Crossbar.io:0.10.1
  • 高速公路|Python:0.9.5
  • 工人:高速公路.asyncio.wamp.ApplicationSession
4

3 回答 3

2

默认情况下,Python stdout/stderr 是缓冲的,因此当您想到时,crossbar 不会看到来宾的日志。

您可以设置环境变量PYTHONUNBUFFERED=1或将-u选项传递给您的解释器。

于 2015-05-27T17:54:20.990 回答
1

crossbar check验证stdout: logstderr: log但我不确定为什么它不记录错误。

我通常会像下面那样做,但你的配置看起来更干净和方便。

设置

按照这个(在 IntelliJ 中调试 Crossbar.io 应用程序)。为您使用的 IDE 做类似的事情,但是,我建议将 PyPy 用于交叉路由器而不是 CPython。

日志记录

遵循此(记录 WAMP 工作人员追溯错误)。您只需要启用 Trace Back Error 日志记录功能。您可以import traceback使用try except或仅使用创建一个简单的__init__函数,如下所示:

class MyComponent(ApplicationSession):
   def __init__(self, config = None):
      ApplicationSession.__init__(self, config)
      self.traceback_app = True

下面是一个完整的工作示例:

错误日志

在此处输入图像描述

.crossbar/config.yaml

controller: {}
workers:
- realms:
  - name: realm1
    roles:
    - name: anonymous
      permissions:
      - {call: true, publish: true, register: true, subscribe: true, uri: '*'}
  transports:
  - endpoint: {port: 8080, type: tcp}
    paths:
      /: {directory: .., type: static}
      ws: {type: websocket}
    type: web
  type: router
- arguments: [backend.py]
  executable: ../../../.pyenv/versions/autobahn/bin/python3
  options:
    watch:
      action: restart
      directories: [..]
    workdir: ..
  type: guest

后端.py

from autobahn.asyncio.wamp import ApplicationSession
from autobahn import wamp

from asyncio import coroutine
import logging


class MyComponent(ApplicationSession):
    def __init__(self, config = None):
        ApplicationSession.__init__(self, config)
        self.traceback_app = True

    @wamp.register("com.myapp.add2")
    def add2(self, x, y):
        if type(y) is str:
            error = ' Sorry! Python can not add int with something else :('
            logging.critical(error)
            return error

        return x + y

    @coroutine
    def onJoin(self, details):
        res = yield from self.register(self)
        print("{} procedures registered.".format(len(res)))

if __name__ == '__main__':
    from autobahn.asyncio.wamp import ApplicationRunner

    runner = ApplicationRunner(url="ws://localhost:8080/ws", realm="realm1")
    runner.run(MyComponent)

前端.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
<script>AUTOBAHN_DEBUG = false;</script>
<script src="http://autobahn.s3.amazonaws.com/autobahnjs/latest/autobahn.min.jgz"></script>

<script>
    var connection = new autobahn.Connection({
        url: "ws://localhost:8080/ws",
        realm: "realm1"
    });

    connection.onopen = function (session, details) {
        // Should work
        session.call("com.myapp.add2", [1, 2]).then(session.log);

        // Expected to log an error
        session.call("com.myapp.add2", [2, "three"]).then(session.log);

        // Expected to log the trace back error
        session.call("com.myapp.add2", ["one", 5]).then(session.log);
    };

    connection.onclose = function (reason, details) {
        console.log("Connection lost: " + reason);
    };

    connection.open();
</script>
</body>
</html>
于 2015-02-02T09:10:13.083 回答
0

我有一个类似的交叉开关问题,在初始启动后没有输出任何东西。即使代码中有 console.log() 。就我而言,它与 node.js 交叉开关路由器有关。

解决方案是在启动命令中添加“--loglevel=debug”

crossbar start --loglevel=debug

然后我开始在执行 console.log() 时看到输出。

于 2019-01-03T22:23:01.553 回答