I am trying to pretty print my restTemplate request and response in pretty print JSON format in the log file using below:
public static RestTemplate createNewRestTemplateWithLogging() {
ClientHttpRequestInterceptor interceptor = new RestLoggingInterceptor();
List<ClientHttpRequestInterceptor> interceptorList = new ArrayList<ClientHttpRequestInterceptor>();
RestTemplate restTemplate = new RestTemplate();
interceptorList.add(interceptor);
restTemplate.setInterceptors(interceptorList);
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
return restTemplate;
}
The log4j2.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<RollingFile name="rest_messages_file_appender" fileName="servers/AdminServer/logs/abc.log"
filePattern="servers/AdminServer/logs/abc-%i.log.gz">
<LevelRangeFilter maxLevel="INFO" />
<PatternLayout>
<Pattern>%d{DEFAULT} %-5p [%c{1}] [%X{hostName}] [%X{transactionId}]
[%X{uuid}|%X{username}|%X{caseNum}]:
%replace{%msg}{(\r|\n|\r\n)+}{}%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="30" />
</RollingFile>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
</Appenders>
<Loggers>
<Logger
name="com.accenture.apsp.architecture.rest.log.interceptor.RestLoggingInterceptor"
level="INFO" additivity="false">
<AppenderRef ref="rest_messages_file_appender" />
</Logger>
<Root level="INFO">
<AppenderRef ref="rest_messages_file_appender" />
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
I used tag as well but still its not working.
It is displaying as below for any JSON:
Outbound Message----------------------------Direction: OUTAddress: http://apsp-opa:7017/opa/determinations-server/batch/auth?grant_type=client_credentials&client_id=rulescompuser&client_secret=Welcome@99Headers: [Accept:"application/json, application/*+json", Content-Type:"application/json", Content-Length:"2"]Total Time (ms): 14Request Time: 2021-06-23 06:56:05,613Request Payload: {}Response Time: 2021-06-23 06:56:05,627Response Payload: {"access_token":"f541be05-580e-123c-c43a-ca4e0ee567bc","token_type":"Bearer","expires_in":1800}----------------------------
Is there a way/pattern to print a formatted JSON for Response Payload in log4j2.xml .
/**
*
* @param response
* @param wsLoggingContext
*/
public void logResponse(ClientHttpResponse response, LoggingContext wsLoggingContext) {
try {
wsLoggingContext.setResponseTime(new Date());
wsLoggingContext.setResponseJson(StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
} catch (Exception e) {
REST_LOGGER.info("Error occured while logging" + e);
}
}
How can we pretty print the request and response payload.