1

ゲスト ワーカーからの出力/ログをキャプチャしたり、デバッグしたりするにはどうすればよいですか? ワーカーは通常の Python3 Autobahn WAMP コンポーネントです。私が書いたものはどこにprintも見つかりません。または、どこを見ればよいかわかりません。ゲストがエラーで終了した場合のみ、クロスバー ログに何かが出力されます。構成は次のとおりです。raisestderr

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

stdoutとオプションはstderrまったく違いがないようです。

バージョン:

  • クロスバー.io: 0.10.1
  • アウトバーン|Python: 0.9.5
  • ワーカー: autobahn.asyncio.wamp.ApplicationSession
4

3 に答える 3

2

デフォルトでは、Python の stdout/stderr はバッファリングされるため、クロスバーはゲストからのログを認識しません。

環境変数を設定するか、オプションをインタープリターにPYTHONUNBUFFERED=1渡すことができます。-u

于 2015-05-27T17:54:20.990 に答える
1

crossbar check検証stdout: logstderr: logますが、なぜエラーが記録されないのかわかりません。

私は通常以下のようにしますが、あなたの設定はよりきれいで便利に見えます。

設定

これに従ってください ( IntelliJ での Crossbar.io アプリのデバッグ)。使用している IDE に対しても同様のことを行いますが、クロスバー ルーターには CPython ではなく PyPy を使用することをお勧めします。

ロギング

これに従ってください ( Logging WAMP worker Trace Back Error )。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

backend.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)

frontend.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 に答える