我想在使用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);
我在這裏的問題是,機械師如存儲要求爲Exchange媒體都在使用這種方法,任何處理器的術語「爲時已晚」在路線中已經太遲了,即,綁定已經發生並且消耗了請求。此外,CamelHttpServletRequest的InputStream已經被讀取並且不包含數據。
使用的日誌EIP的第一個位置直接地是單處理器之前:
from(SERVICE_CONTEXT_IN).log(LoggingLevel.INFO, "Request: ${in.body}")
.process(this.serviceProcessor);
但是在該點的${in.body}
已經是MyServiceRequest
一個實例。上面添加的日誌簡單地產生Request: [email protected]
。我想記錄的是在綁定到POJO之前的原始JSON。
在RestConfigurationDefinition或RestDefinition中似乎沒有啓用「原始」請求記錄的內置方式。
我可以擺脫自動JSON綁定,並手動讀取HTTP Post請求的InputStream,記錄和執行手動解組等,但我想保持內置綁定。
如果你使用的是logback和jetty 7(也許是8),你可能會看看[logback-access](http://logback.qos.ch/access.html)。根據[Camel-Jetty文檔](http://camel.apache.org/jetty.html),Camel(特別是DefaultHttpBinding)會將輸入流複製到放入消息正文中的sream緩存中。從他們你可以簡單地使用'.log(LoggingLevel.Debug,「$ {in.body}」)''來記錄它。除此之外,Camel會將HTTP頭自動複製到您可以像普通交換頭一樣訪問的交換頭。 –
通過記錄最初的原始請求,不能確定你的意思嗎?您可以從()中記錄原始有效負載。可以從Exchange頭文件/屬性訪問HTTP頭文件。你還想記錄什麼? –
@ roman-vottner我編輯的問題包括駱駝的日誌EIP以及它不會產生預期效果的事實。儘管如此,我還沒有嘗試過logback-access。 – ahor