I have SOAP and REST services in my application and I have CXF configured with spring and xml to show the logging. The SOAP services show them well, but the RESTs do not. My configuration is as follows:
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
Also, I use slf4j and this is my logback.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
<RemoteHost>localhost</RemoteHost>
<Port>4560</Port>
<ReconnectionDelay>170</ReconnectionDelay>
<IncludeCallerData>true</IncludeCallerData>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{ISO8601} |-%-5level in %logger - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework.beans" level="warn" />
<logger name="org.springframework.binding" level="warn" />
<logger name="org.springframework.jdbc" level="warn" />
<logger name="org.springframework.transaction" level="warn" />
<logger name="org.springframework.orm" level="warn" />
<logger name="org.springframework.web" level="warn" />
<logger name="org.springframework.faces" level="warn" />
<logger name="org.springframework.webflow" level="warn" />
<logger name="org.springframework.ldap" level="warn" />
<logger name="org.springframework.security" level="warn" />
<logger name="org.apache.cxf.services" level="info" />
<logger name="org.apache.cxf.endpoint" level="info"/>
<root level="warn">
<appender-ref ref="STDOUT" />
<appender-ref ref="SOCKET"/>
</root>
</configuration>
I've also tried creating interceptors in
<bean id="ContextInInterceptor" class="example.interceptors.ContextMessageInInterceptor"></bean>
<bean id="ContextOutInterceptor" class="example.interceptors.ContextMessageOutInterceptor"></bean>
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
<cxf:inInterceptors>
<ref bean="ContextInInterceptor"/>
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="ContextOutInterceptor"/>
</cxf:outInterceptors>
</cxf:bus>
These are the classes that represent the beans:
public class ContextMessageInInterceptor extends AbstractPhaseInterceptor<org.apache.cxf.message.Message> {
@Autowired
ContextJSONInInterceptor contextJSONInInterceptor;
public ContextMessageInInterceptor() {
super(Phase.PRE_INVOKE);
}
@Override
public void handleMessage(Message message) {
if (message instanceof XMLMessage) {
contextJSONInInterceptor.handleMessage((XMLMessage) message);
}else{
if(message instanceof MessageImpl){
if(!(message instanceof SoapMessage)){
contextJSONInInterceptor.handleMessage(message);
}
}
}
}
}
public class ContextMessageOutInterceptor extends AbstractPhaseInterceptor<Message> {
@Autowired
ContextSOAPOutInterceptor contextSOAPOutInterceptor;
@Autowired
ContextJSONOutInterceptor contextJSONOutInterceptor;
public ContextMessageOutInterceptor() {
super(Phase.WRITE);
addBefore(SoapOutInterceptor.class.getName());
}
@Override
public void handleMessage(Message message) throws Fault {
if (message instanceof SoapMessage) {
contextSOAPOutInterceptor.handleMessage((SoapMessage) message);
} else {
if (message instanceof XMLMessage) {
contextJSONOutInterceptor.handleMessage(message);
}else{
if(message instanceof MessageImpl){
contextJSONOutInterceptor.handleMessage(message);
}
}
}
}
}
public class ContextSOAPOutInterceptor extends AbstractSoapInterceptor {
@Autowired(required = true)
ContextService contextService;
public ContextSOAPOutInterceptor() {
super(Phase.WRITE);
addBefore(SoapOutInterceptor.class.getName());
}
@Override
public void handleMessage(SoapMessage message) {
}
}
public class ContextJSONInInterceptor
extends AbstractPhaseInterceptor<Message> {
@Autowired(required = true)
ContextService contextService;
@Autowired
ContextJSONInInterceptor contextJSONInInterceptor;
public ContextJSONInInterceptor() {
super(Phase.PRE_INVOKE);
}
@Override
public void handleMessage(Message message) throws Fault {
if (message instanceof XMLMessage) {
ContextInfo contextObj = this.contextService.getContext();
// If no locale is set in the context, take the default one
if (contextObj.getLocale() == null) {
contextObj.setLocale(ConfigHelper
.getInstance().getConfigParameter(new ConfigId(CategoryGroupEnum.ang,
AngConfigCategoryEnum.LANGUAGE, AngConfigParamEnum.DEFAULT_LOCALE), "en_GB")
.toLowerCase());
}
} else {
if (message instanceof MessageImpl) {
System.out.println("Content-Type: " + message.get(Message.CONTENT_TYPE));
System.out.println(message.toString());
System.out.println("---------------");
}
}
}
}
public class ContextJSONOutInterceptor extends
org.apache.cxf.jaxrs.provider.jsonp.AbstractJsonpOutInterceptor {
@Autowired(required = true)
ContextService contextService;
public static final String ANG_SECURITY_CONTEXT_KEY = "connectionToken";
public ContextJSONOutInterceptor() {
super(Phase.WRITE);
addBefore(SoapOutInterceptor.class.getName());
}
@Override
public void handleMessage(Message message) throws Fault {
System.out.println("Content-Type: " + Message.CONTENT_TYPE);
System.out.println(message.toString());
System.out.println("---------------");
}
}
I do not know what I'm doing wrong. I just need the REST services to show something similar to my SOAP services: