Camel Restエンドポイントを使用しているときに元の「生の」リクエストボディ(JSONなど)を記録したいとします。これを行う適切な方法は何ですか?Camel Restを使用しているときにリクエストペイロードを記録する方法は?
マイセットアップ(RouteBuilder)は次のようになります。ここ
restConfiguration().component("jetty")
.host(this.host)
.port(this.port)
.contextPath(this.contextPath)
.bindingMode(RestBindingMode.json);
rest("myService/").post()
.produces("application/json; charset=UTF-8")
.type(MyServiceRequest.class)
.outType(MyServiceResponse.class)
.to(SERVICE_CONTEXT_IN);
from(SERVICE_CONTEXT_IN).process(this.serviceProcessor);
私の問題は、いずれかのプロセッサは、そのような取引の性質として要求を保存するようメカニックは、このアプローチを使用したという点で「遅すぎる」ということですルートで遅すぎます。つまり、バインドが既に行われ、リクエストを消費しました。 CamelHttpServletRequestのInputStreamもすでに読み込まれており、データは含まれていません。
ログEIPを使用する最初の場所は、シングルプロセッサの直前にある:
from(SERVICE_CONTEXT_IN).log(LoggingLevel.INFO, "Request: ${in.body}")
.process(this.serviceProcessor);
が、その時点で${in.body}
既にMyServiceRequest
のインスタンスです。上のログを追加すると、単純にRequest: [email protected]
が得られます。私が記録したいのは、オリジナルのJSONをPOJOにバインドする前です。
RestConfigurationDefinitionやRestDefinitionで 'raw'リクエストのログを有効にする組み込みの方法はないようです。
私は自動JSONバインディングを取り除き、HTTP Post要求のInputStreamを手動で読み込み、専用のプロセッサで手動で非整列化などを実行できますが、ビルトインバインディングを保持したいと思います。
ログバックとjetty 7(おそらく8)を使用している場合は、[logback-access](http://logback.qos.ch/access.html)を調べることができます。 [Camel-Jetty documentation](http://camel.apache.org/jetty.html)によれば、Camel(特にDefaultHttpBinding)は、入力ストリームをメッセージ本文に入れられたストリームキャッシュにコピーします。彼らからあなたは単に '.log(LoggingLevel.Debug、" $ {in.body} ")'を使って簡単にログに記録することができます。それに加えて、Camelは通常のExchangeヘッダーのようにアクセスできるExchangeヘッダーにHTTPヘッダーを自動的にコピーします。 –
元の生のリクエストを記録することが何を意味するのではないでしょうか?未処理のペイロードは、from()に記録できます。HTTPヘッダーは、Exchangeヘッダー/プロパティからアクセスできます。他に何を記録したいですか? –
@ roman-vottner私は、CamelのLog EIPと、それが望む効果をもたらさないという事実を含む質問を編集しました。私はまだログバックアクセスを試していません。 – ahor