0

我有Spring boot server,它的工作方式就像proxy. 它是SOAP serviceSOAP client。用户在我的服务器上调用肥皂服务,而我的服务器调用另一个肥皂服务。两种服务都使用一个WSDL. 我的服务器实现了这一点WSDL并充当客户端的服务器。我的服务器使用它WSDL来请求另一台服务器并充当另一台服务器的客户端。

Client -> WSDL -> My server -> WSDL -> Another server
           |                     |  
           |------same WSDL------|

我需要管理 SOAP 日志,但我遇到了问题。例如,我可以添加到 logback 下一行:

  <logger name="org.apache.cxf.services.MessageExchangePortType.REQ_IN" level="ERROR" />
  <logger name="org.apache.cxf.services.MessageExchangePortType.RESP_IN" level="ERROR" />

  <logger name="org.apache.cxf.services.MessageExchangePortType.REQ_OUT" level="INFO" />
  <logger name="org.apache.cxf.services.MessageExchangePortType.RESP_OUT" level="INFO" /> 

但是通过这种方式,我可以管理传入和传出消息的日志。

因为我的服务和客户使用MessageExchangePortType.

如何管理每个客户端/服务器日志?

这是客户端的实现:

    @Bean(name = "MessageExchangeClient")
    public MessageExchangePortType signingPortType() {
        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        jaxWsProxyFactoryBean.setServiceClass(MessageExchangePortType.class);
        jaxWsProxyFactoryBean.setAddress(host);
        jaxWsProxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
        jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
        jaxWsProxyFactoryBean.getOutInterceptors().add(new FaultOutInterceptor());
        jaxWsProxyFactoryBean.getOutInterceptors().add(new FaultOutInterceptor());
        return (MessageExchangePortType) jaxWsProxyFactoryBean.create();
    }

这是服务器的实现:

Component
@Slf4j
@SchemaValidation(type = SchemaValidation.SchemaValidationType.IN)
public class MyEndpoint implements MessageExchangePortType {

并在配置中:

@Configuration
public class WebServiceConfiguration {

    @Value("${server.path}")
    private String path;

    private final Bus bus;
    private final MyEndpoint myEndpoint;

    @Autowired
    public WebServiceConfiguration(Bus bus, MyEndpoint myEndpoint) {
        this.bus = bus;
        this.myEndpoint= myEndpoint;
    }

    @Bean
    Endpoint endpoint() {

        EndpointImpl endpoint = new EndpointImpl(bus, myEndpoint);

        endpoint.getInInterceptors().add(new SAAJInInterceptor());

        LoggingFeature loggingFeature = new LoggingFeature();
        loggingFeature.setVerbose(true);
        loggingFeature.setLogMultipart(true);
        loggingFeature.setPrettyLogging(true);
        endpoint.getFeatures().add(loggingFeature);

        endpoint.publish(path);

        return endpoint;
    }
}

例如,我想REQ_IN在客户端禁用日志并在服务器上启用,但如果我写:<logger name="org.apache.cxf.services.MessageExchangePortType.REQ_IN" level="ERROR" />

我将错误级别设置为客户端和服务器,因为MessageExchangePortType使用客户端和服务器。

4

1 回答 1

1

实现您自己的类型org.apache.cxf.ext.logging.event.LogEventSender并更改类别。查看org.apache.cxf.ext.logging.slf4j.Slf4jEventSender您默认使用的实现,以了解如何实现它。

于 2018-10-19T07:39:15.150 回答