Skip to content

Commit 49e14e5

Browse files
authored
Merge pull request #548 from commercetools/log_formatter
add option to customise log formats
2 parents f79f7fd + b06a407 commit 49e14e5

File tree

10 files changed

+116
-16
lines changed

10 files changed

+116
-16
lines changed

commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/defaultconfig/ApiRootBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,15 @@ public ApiRootBuilder withInternalLoggerFactory(final InternalLoggerFactory inte
655655
deprecationLogEvent, defaultExceptionLogEvent, exceptionLogEvents));
656656
}
657657

658+
public ApiRootBuilder withInternalLoggerFactory(final InternalLoggerFactory internalLoggerFactory,
659+
final Level responseLogEvent, final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
660+
final Map<Class<? extends Throwable>, Level> exceptionLogEvents,
661+
final ResponseLogFormatter responseLogFormatter, final ErrorLogFormatter errorLogFormatter) {
662+
return with(clientBuilder -> clientBuilder.withInternalLoggerFactory(internalLoggerFactory, responseLogEvent,
663+
deprecationLogEvent, defaultExceptionLogEvent, exceptionLogEvents, responseLogFormatter,
664+
errorLogFormatter));
665+
}
666+
658667
public ApiRootBuilder withApiBaseUrl(String apiBaseUrl) {
659668
return with(clientBuilder -> clientBuilder.withApiBaseUrl(apiBaseUrl));
660669
}

commercetools/commercetools-sdk-java-history/src/main/java/com/commercetools/history/defaultconfig/HistoryApiRootBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,15 @@ public HistoryApiRootBuilder withInternalLoggerFactory(final InternalLoggerFacto
389389
return this;
390390
}
391391

392+
public HistoryApiRootBuilder withInternalLoggerFactory(final InternalLoggerFactory internalLoggerFactory,
393+
final Level responseLogEvent, final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
394+
final Map<Class<? extends Throwable>, Level> exceptionLogEvents,
395+
final ResponseLogFormatter responseLogFormatter, final ErrorLogFormatter errorLogFormatter) {
396+
return with(clientBuilder -> clientBuilder.withInternalLoggerFactory(internalLoggerFactory, responseLogEvent,
397+
deprecationLogEvent, defaultExceptionLogEvent, exceptionLogEvents, responseLogFormatter,
398+
errorLogFormatter));
399+
}
400+
392401
public HistoryApiRootBuilder withApiBaseUrl(String apiBaseUrl) {
393402
builder.withApiBaseUrl(apiBaseUrl);
394403

commercetools/commercetools-sdk-java-importapi/src/main/java/com/commercetools/importapi/defaultconfig/ImportApiRootBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,15 @@ public ImportApiRootBuilder withInternalLoggerFactory(final InternalLoggerFactor
389389
return this;
390390
}
391391

392+
public ImportApiRootBuilder withInternalLoggerFactory(final InternalLoggerFactory internalLoggerFactory,
393+
final Level responseLogEvent, final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
394+
final Map<Class<? extends Throwable>, Level> exceptionLogEvents,
395+
final ResponseLogFormatter responseLogFormatter, final ErrorLogFormatter errorLogFormatter) {
396+
return with(clientBuilder -> clientBuilder.withInternalLoggerFactory(internalLoggerFactory, responseLogEvent,
397+
deprecationLogEvent, defaultExceptionLogEvent, exceptionLogEvents, responseLogFormatter,
398+
errorLogFormatter));
399+
}
400+
392401
public ImportApiRootBuilder withApiBaseUrl(String apiBaseUrl) {
393402
builder.withApiBaseUrl(apiBaseUrl);
394403

commercetools/internal-docs/src/main/java/com/commercetools/docs/meta/Logging.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
import java.util.Map;
55

6+
import io.vrap.rmf.base.client.http.ErrorLogFormatter;
67
import io.vrap.rmf.base.client.http.InternalLoggerFactory;
8+
import io.vrap.rmf.base.client.http.ResponseLogFormatter;
79

810
import org.slf4j.event.Level;
911

@@ -17,7 +19,7 @@
1719
*
1820
* <p>The {@link io.vrap.rmf.base.client.ClientBuilder} allows the customization of the log levels used for different events. By default responses
1921
* will be logged with {@link org.slf4j.event.Level#INFO} and errors with {@link org.slf4j.event.Level#ERROR}. The
20-
* {@link io.vrap.rmf.base.client.ClientBuilder#withInternalLoggerFactory(InternalLoggerFactory, Level, Level, Level, Map)} method can be used
22+
* {@link io.vrap.rmf.base.client.ClientBuilder#withInternalLoggerFactory(InternalLoggerFactory, Level, Level, Level, Map, ResponseLogFormatter, ErrorLogFormatter)} method can be used
2123
* to change these defaults. Please see also {@link io.vrap.rmf.base.client.http.InternalLoggerMiddleware} for further details</p>
2224
*
2325
* {@include.example example.ExamplesTest#loggingConfiguration}

rmf/rmf-java-base/src/main/java/io/vrap/rmf/base/client/ClientBuilder.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,6 +1381,24 @@ public ClientBuilder withInternalLoggerFactory(final InternalLoggerFactory inter
13811381
deprecationLogEvent, defaultExceptionLogEvent, exceptionLogEvents));
13821382
}
13831383

1384+
/**
1385+
* @param internalLoggerFactory {@link InternalLoggerFactory} creates the logger for request & responses
1386+
* @param responseLogEvent {@link Level} for logging responses.
1387+
* @param deprecationLogEvent {@link Level} for logging {@link ApiHttpHeaders#X_DEPRECATION_NOTICE}
1388+
* @param defaultExceptionLogEvent {@link Level} for logging errors
1389+
* @param exceptionLogEvents {@link Level} for logging by exception class
1390+
* @param responseLogFormatter {@link ResponseLogFormatter} response log formatter
1391+
* @return ClientBuilder instance
1392+
*/
1393+
public ClientBuilder withInternalLoggerFactory(final InternalLoggerFactory internalLoggerFactory,
1394+
final Level responseLogEvent, final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
1395+
final Map<Class<? extends Throwable>, Level> exceptionLogEvents,
1396+
final ResponseLogFormatter responseLogFormatter, final ErrorLogFormatter errorLogFormatter) {
1397+
return withInternalLoggerMiddleware(
1398+
InternalLoggerMiddleware.of(internalLoggerFactory, responseLogEvent, deprecationLogEvent,
1399+
defaultExceptionLogEvent, exceptionLogEvents, responseLogFormatter, errorLogFormatter));
1400+
}
1401+
13841402
/**
13851403
* @param apiBaseUrl base URI for calling the API
13861404
* @return ClientBuilder instance
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
package io.vrap.rmf.base.client.http;
3+
4+
import io.vrap.rmf.base.client.ApiHttpRequest;
5+
6+
@FunctionalInterface
7+
public interface ErrorLogFormatter {
8+
public String format(ApiHttpRequest request, Throwable throwable, long executionTime);
9+
}

rmf/rmf-java-base/src/main/java/io/vrap/rmf/base/client/http/InternalLoggerMiddleware.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,12 @@ static InternalLoggerMiddleware of(final InternalLoggerFactory internalLoggerFac
3939
return new InternalLoggerMiddlewareImpl(internalLoggerFactory, responseLogEvent, deprecationLogEvent,
4040
defaultExceptionLogEvent, exceptionLogEvents);
4141
}
42+
43+
static InternalLoggerMiddleware of(final InternalLoggerFactory internalLoggerFactory, final Level responseLogEvent,
44+
final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
45+
final Map<Class<? extends Throwable>, Level> exceptionLogEvents,
46+
final ResponseLogFormatter responseLogFormatter, final ErrorLogFormatter errorLogFormatter) {
47+
return new InternalLoggerMiddlewareImpl(internalLoggerFactory, responseLogEvent, deprecationLogEvent,
48+
defaultExceptionLogEvent, exceptionLogEvents, responseLogFormatter, errorLogFormatter);
49+
}
4250
}

rmf/rmf-java-base/src/main/java/io/vrap/rmf/base/client/http/InternalLoggerMiddlewareImpl.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class InternalLoggerMiddlewareImpl implements InternalLoggerMiddleware {
2626
private final Level responseLogEvent;
2727
private final Level defaultExceptionLogEvent;
2828
private final Map<Class<? extends Throwable>, Level> exceptionLogEvents;
29+
private final ResponseLogFormatter responseLogFormatter;
30+
private final ErrorLogFormatter errorLogFormatter;
2931

3032
public InternalLoggerMiddlewareImpl(final InternalLoggerFactory factory) {
3133
this(factory, Level.INFO, Level.INFO);
@@ -34,17 +36,28 @@ public InternalLoggerMiddlewareImpl(final InternalLoggerFactory factory) {
3436
public InternalLoggerMiddlewareImpl(final InternalLoggerFactory factory, final Level responseLogEvent,
3537
Level deprecationLogEvent) {
3638
this(factory, responseLogEvent, deprecationLogEvent, Level.ERROR,
37-
Collections.singletonMap(ConcurrentModificationException.class, Level.INFO));
39+
Collections.singletonMap(ConcurrentModificationException.class, Level.INFO), LogFormatter::formatResponse,
40+
LogFormatter::formatError);
3841
}
3942

4043
public InternalLoggerMiddlewareImpl(final InternalLoggerFactory factory, final Level responseLogEvent,
4144
final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
4245
final Map<Class<? extends Throwable>, Level> exceptionLogEvents) {
46+
this(factory, responseLogEvent, deprecationLogEvent, defaultExceptionLogEvent, exceptionLogEvents,
47+
LogFormatter::formatResponse, LogFormatter::formatError);
48+
}
49+
50+
public InternalLoggerMiddlewareImpl(final InternalLoggerFactory factory, final Level responseLogEvent,
51+
final Level deprecationLogEvent, final Level defaultExceptionLogEvent,
52+
final Map<Class<? extends Throwable>, Level> exceptionLogEvents,
53+
final ResponseLogFormatter responseLogFormatter, final ErrorLogFormatter errorLogFormatter) {
4354
this.factory = factory;
4455
this.responseLogEvent = responseLogEvent;
4556
this.deprecationLogEvent = deprecationLogEvent;
4657
this.defaultExceptionLogEvent = defaultExceptionLogEvent;
4758
this.exceptionLogEvents = exceptionLogEvents;
59+
this.responseLogFormatter = responseLogFormatter;
60+
this.errorLogFormatter = errorLogFormatter;
4861
}
4962

5063
@Override
@@ -105,14 +118,7 @@ public CompletableFuture<ApiHttpResponse<byte[]>> invoke(final ApiHttpRequest re
105118
.findFirst()
106119
.map(Map.Entry::getValue)
107120
.orElse(defaultExceptionLogEvent);
108-
responseLogger.log(level, () -> String
109-
.format("%s %s %s %s %s %s", request.getMethod().name(), request.getUrl(),
110-
errorResponse.getStatusCode(), executionTime,
111-
Optional.ofNullable(errorResponse.getHeaders().getFirst(ApiHttpHeaders.SERVER_TIMING))
112-
.orElse("-"),
113-
Optional.ofNullable(
114-
errorResponse.getHeaders().getFirst(ApiHttpHeaders.X_CORRELATION_ID)).orElse("-"))
115-
.trim());
121+
responseLogger.log(level, () -> responseLogFormatter.format(request, errorResponse, executionTime));
116122
final List<Map.Entry<String, String>> notices = errorResponse.getHeaders()
117123
.getHeaders(ApiHttpHeaders.X_DEPRECATION_NOTICE);
118124
if (notices != null) {
@@ -133,19 +139,16 @@ public CompletableFuture<ApiHttpResponse<byte[]>> invoke(final ApiHttpRequest re
133139
.findFirst()
134140
.map(Map.Entry::getValue)
135141
.orElse(defaultExceptionLogEvent);
136-
responseLogger.log(level, throwable::getCause, throwable);
142+
responseLogger.log(level, () -> errorLogFormatter.format(request, cause, executionTime), cause);
137143
}
138144
requestContext.ifPresent(c -> MDC.clear());
139145
}
140146
else {
141147
final Optional<MDCContext> responseContext = Optional.ofNullable(response.getContext(MDCContext.class));
142148
responseContext.ifPresent(c -> MDC.setContextMap(c.getValue()));
143149

144-
responseLogger.log(responseLogEvent, () -> String.format("%s %s %s %s %s %s",
145-
request.getMethod().name(), request.getUrl(), response.getStatusCode(), executionTime,
146-
Optional.ofNullable(response.getHeaders().getFirst(ApiHttpHeaders.SERVER_TIMING)).orElse("-"),
147-
Optional.ofNullable(response.getHeaders().getFirst(ApiHttpHeaders.X_CORRELATION_ID)).orElse("-"))
148-
.trim());
150+
responseLogger.log(responseLogEvent,
151+
() -> responseLogFormatter.format(request, response, executionTime));
149152
final List<Map.Entry<String, String>> notices = response.getHeaders()
150153
.getHeaders(ApiHttpHeaders.X_DEPRECATION_NOTICE);
151154
if (notices != null) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
package io.vrap.rmf.base.client.http;
3+
4+
import java.util.Optional;
5+
6+
import io.vrap.rmf.base.client.ApiHttpHeaders;
7+
import io.vrap.rmf.base.client.ApiHttpRequest;
8+
import io.vrap.rmf.base.client.ApiHttpResponse;
9+
10+
public class LogFormatter {
11+
public static String formatResponse(ApiHttpRequest request, ApiHttpResponse<byte[]> response, long executionTime) {
12+
return String
13+
.format("%s %s %s %s %s %s", request.getMethod().name(), request.getUrl(), response.getStatusCode(),
14+
executionTime,
15+
Optional.ofNullable(response.getHeaders().getFirst(ApiHttpHeaders.SERVER_TIMING)).orElse("-"),
16+
Optional.ofNullable(response.getHeaders().getFirst(ApiHttpHeaders.X_CORRELATION_ID)).orElse("-"))
17+
.trim();
18+
}
19+
20+
public static String formatError(ApiHttpRequest request, Throwable throwable, long executionTime) {
21+
return throwable.toString();
22+
}
23+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
package io.vrap.rmf.base.client.http;
3+
4+
import io.vrap.rmf.base.client.ApiHttpRequest;
5+
import io.vrap.rmf.base.client.ApiHttpResponse;
6+
7+
@FunctionalInterface
8+
public interface ResponseLogFormatter {
9+
public String format(ApiHttpRequest request, ApiHttpResponse<byte[]> response, long executionTime);
10+
}

0 commit comments

Comments
 (0)