2016-11-15 2 views
2

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を手動で読み込み、専用のプロセッサで手動で非整列化などを実行できますが、ビルトインバインディングを保持したいと思います。

+0

ログバックと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ヘッダーを自動的にコピーします。 –

+0

元の生のリクエストを記録することが何を意味するのではないでしょうか?未処理のペイロードは、from()に記録できます。HTTPヘッダーは、Exchangeヘッダー/プロパティからアクセスできます。他に何を記録したいですか? –

+0

@ roman-vottner私は、CamelのLog EIPと、それが望む効果をもたらさないという事実を含む質問を編集しました。私はまだログバックアクセスを試していません。 – ahor

答えて

1

restConfiguration().component("jetty") 
    .host(this.host) 
    .port(this.port) 
    .contextPath(this.contextPath); 

rest("myService/").post() 
    .produces("application/json; charset=UTF-8") 
    .to(SERVICE_CONTEXT_IN); 

from(SERVICE_CONTEXT_IN).process(this.requestLogProcessor) 
    .unmarshal() 
    .json(JsonLibrary.Jackson, MyServiceRequest.class) 
    .process(this.serviceProcessor) 
    .marshal() 
    .json(JsonLibrary.Jackson); 

すべてrequestLogProcessorInputStreamとしてin体を読み取ることがされていStringを取得してログに記録し、最終的に渡します。

2

キャメルレストのエンドポイントを使用して、生のリクエストをログに記録する方法がないことに同意します。

しかし、考慮にRoman Vottnerを取って、次のように、あなたはあなたのrestConfiguration()を変更することがあります。

restConfiguration().component("jetty") 
    .host(this.host) 
    .port(this.port) 
    .componentProperty("handlers", "#yourLoggingHandler") 
    .contextPath(this.contextPath) 
    .bindingMode(RestBindingMode.json); 
あなた #yourLoggingHandlerニーズがあなたのレジストリに登録する

org.eclipse.jetty.server.Handlerを実装します。 Jettyのマニュアルhttp://www.eclipse.org/jetty/documentation/current/jetty-handlers.html#writing-custom-handlersでカスタムハンドラを記述してください。私はペイロードを記録するために高度に洗練されたプロセッサと結合REST DSLを使用していないことにより、この「解決」末端で

+1

私はこれをテストしませんでしたが、これはJettyのフレームワークメカニックを使用するという点で正しい答えです。 - 単純なロギングを得るためには、コアの 'Handler'メカニズムIMHOを掘り下げることが少し上です。 – ahor

関連する問題