2017-06-01 89 views
3

我正在使用一個彈簧啓動應用程序內的soap webservice。響應/請求記錄太大,因爲一個屬性太大。所以我想攔截該日誌並刪除違規屬性。如何覆蓋客戶端肥皂記錄 - 春季啓動

我一直在搞SoapEnvelopeLoggingInterceptor,但我認爲這只是服務器端日誌記錄。它不會被拾起。

我已經配置裏面陽明我的肥皂記錄如下:

logging: 
    pattern: 
    ... 
    level: 
    ... 
    org.springframework.ws.client.MessageTracing.sent: TRACE 
    org.springframework.ws.client.MessageTracing.received: TRACE 
    org.springframework.ws.server.MessageTracing: DEBUG 

這工作正常登錄請求和響應,但我需要從信封中刪除一個非常大的問題的屬性。有任何想法嗎?

+0

我說明白正確的,你要削減從日誌消息根據消息內容一些文本?或者如果日誌消息不包含某些特定內容,您只想顯示日誌 –

+0

肥皂信封內,我想替換特定屬性(例如) asdasd ...刪除的過大。,In所有情況下,即屬性。我有用正則表達式來做這件事的邏輯。我只是不知道如何掛鉤它。 – HellishHeat

+0

那麼在這種情況下,我認爲你唯一的選擇是根據你自己的規範創建你自己的SOAPLoggingInterceptor e管理請求和肥皂 –

回答

2

您可以創建實施ClientInterceptor s handleRequesthandleResponse解析,修改和記錄您的自定義消息。

以下代碼委託給AbstractLoggingInterceptorhandleRequesthandleResponse並重寫logMessage以創建自定義消息。

喜歡的東西

public class MyInterceptor implements ClientInterceptor { 

    private final Logger logger = LoggerFactory.getLogger(MyInterceptor.class); 

    private EndpointInterceptor endpointInterceptor = new AbstractLoggingInterceptor() { 
     @Override 
     protected Source getSource(WebServiceMessage webServiceMessage) { 
      // Base logic same as SoapEnvelopeLoggingInterceptor getSource method.You can adjust to your preference. 
      if(webServiceMessage instanceof SoapMessage) { 
       SoapMessage soapMessage = (SoapMessage)webServiceMessage; 
       return soapMessage.getEnvelope().getSource(); 
      } else { 
       return null; 
      } 
     } 
     @Override 
     protected void logMessage(String message) { 
      // You can use your regex to remove the attribute and log the message. 
      this.logger.debug(message); 
     } 
    }; 

    @Override 
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 
     return endpointInterceptor.handleRequest(messageContext, null); 

    } 

    @Override 
    public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException { 
     return endpointInterceptor.handleResponse(messageContext, null); 

    } 

    @Override 
    public boolean handleFault(MessageContext messageContext) throws WebServiceClientException { 
     return true; 
    } 

    @Override 
    public void afterCompletion(MessageContext messageContext, Exception e) throws WebServiceClientException {} 
} 
+0

我會接受這個答案,因爲它似乎比@Oleksandr Shpota的回答更適合我的需要(而且我沒有賞金時間)。我沒有機會正確測試,所以我會在本週晚些時候提供進一步的反饋意見。謝謝。 – HellishHeat

+1

這是我曾經度過的最好的50分。謝謝!注意未來感興趣的各方:您可能會發現有必要重寫EndPointInterceptor中的isLogEnabled(),因爲它僅在缺省情況下適用於調試級別。另外刪除彈簧的MessageTracing屬性/ yml,否則你會得到雙重記錄。 – HellishHeat

2

沒有簡單的方法來做到這一點。您可以通過extending sl4j API實現您自己的Logger或者打包日誌調用並在那裏進行轉換。

第一種方法將需要一些努力,因爲您需要實現批處理類並確保日誌系統的其他部分沒有損壞。

但第二部分是相當海峽前進。 你有TI創建一個實現Logger接口記錄儀的包裝,可能是這樣的:

public class LoggerWrapper extends MarkerIgnoringBase { 
    private final Logger logger; 

    public LoggerWrapper(Logger logger) { 
     this.logger = logger; 
    } 

    private String transformMessage(String input) { 
     // do all needed regexp transformations here 
    } 

    @Override 
    public void debug(String msg) { 
     String transformedMessage = transformMessage(msg); 
     // delegate log call to inner logger 
     logger.debug(transformedMessage); 
    } 

    // implement the rest of the methods here 
} 

而且在你的代碼可能會使用這樣的:

private static final Logger log = new LoggerWrapper(
     LoggerFactory.getLogger(SomeClass.class) 
); 

您也可以包裝記錄儀無需執行Logger接口(在我的情況下它是MarkerIgnoringBase類)。在這種情況下,您不需要從界面實現多個方法,但是您可以提供可互換性。

此解決方案的缺點是,您必須事先在您身邊登錄消息(不通過MessageTracing),但如果可能的話,我會這樣。另一方面,第一種解決方案是開箱即用的。

+1

感謝您的回答,我將與第二個答案一起去,因爲它更適合我的目的。 – HellishHeat