2017-06-01 92 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