Skip to content
This repository was archived by the owner on Jun 4, 2024. It is now read-only.

Commit e35d990

Browse files
committed
Implement #22: add class and message fields to JSON
1 parent 224ec90 commit e35d990

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

json-logger/src/main/java/uk/bot_by/aws_lambda/slf4j/json_output/JSONLoggerOutput.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public class JSONLoggerOutput implements AWSLambdaLoggerOutput {
4747
private static final Long START_TIME = System.currentTimeMillis();
4848
private static final String THREAD_ID = "thread-id";
4949
private static final String THREAD_NAME = "thread-name";
50+
private static final String THROWABLE_CLASS = "throwable-class";
51+
private static final String THROWABLE_MESSAGE = "throwable-message";
5052
private static final String TIMESTAMP = "timestamp";
5153

5254
private static void addLevel(Level level, JSONObject jsonObject) {
@@ -76,6 +78,20 @@ private static void addThread(AWSLambdaLoggerConfiguration configuration, JSONOb
7678
}
7779
}
7880

81+
private static void addThrowable(Throwable throwable, JSONObject jsonObject) {
82+
if (nonNull(throwable)) {
83+
jsonObject.put(THROWABLE_CLASS, throwable.getClass().getName());
84+
if (nonNull(throwable.getMessage())) {
85+
jsonObject.put(THROWABLE_MESSAGE, throwable.getMessage());
86+
}
87+
88+
var stackTraceOutputStream = new ByteArrayOutputStream();
89+
90+
throwable.printStackTrace(new PrintStream(stackTraceOutputStream));
91+
jsonObject.put(STACK_TRACE, stackTraceOutputStream);
92+
}
93+
}
94+
7995
@SuppressWarnings("ConstantConditions")
8096
private static void addTimestamp(AWSLambdaLoggerConfiguration configuration,
8197
JSONObject jsonObject) {
@@ -130,12 +146,7 @@ void log(@NotNull AWSLambdaLoggerConfiguration configuration, @NotNull LambdaLog
130146
addLevel(level, jsonObject);
131147
addLogName(configuration, jsonObject);
132148
jsonObject.put(MESSAGE, message);
133-
if (nonNull(throwable)) {
134-
var stackTraceOutputStream = new ByteArrayOutputStream();
135-
136-
throwable.printStackTrace(new PrintStream(stackTraceOutputStream));
137-
jsonObject.put(STACK_TRACE, stackTraceOutputStream);
138-
}
149+
addThrowable(throwable, jsonObject);
139150

140151
synchronized (START_TIME) {
141152
lambdaLogger.log(jsonObject.toString());

json-logger/src/test/java/uk/bot_by/aws_lambda/slf4j/json_output/JSONLoggerOutputTest.java

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package uk.bot_by.aws_lambda.slf4j.json_output;
22

33
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.core.IsEqual.equalTo;
45
import static org.hamcrest.core.StringStartsWith.startsWith;
56
import static org.junit.jupiter.api.Assertions.assertAll;
67
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
8+
import static org.junit.jupiter.api.Assertions.assertFalse;
79
import static org.junit.jupiter.api.Assertions.assertTrue;
810
import static org.mockito.ArgumentMatchers.any;
911
import static org.mockito.ArgumentMatchers.anyString;
@@ -248,16 +250,17 @@ void showLogName() {
248250
stringCaptor.getValue(), true);
249251
}
250252

251-
@DisplayName("Print a stack trace")
253+
@DisplayName("Print a throwable")
252254
@Test
253-
void stackTrace() {
255+
void throwableWithMessage() {
254256
// given
255257
var throwable = mock(Throwable.class);
256258

257259
doAnswer(invocationOnMock -> {
258260
invocationOnMock.getArgument(0, PrintStream.class).println("*");
259261
return null;
260262
}).when(throwable).printStackTrace(isA(PrintStream.class));
263+
when(throwable.getMessage()).thenReturn("test message");
261264
when(configuration.requestId()).thenReturn("request#");
262265

263266
// when
@@ -269,7 +272,40 @@ void stackTrace() {
269272

270273
var jsonObject = new JSONObject(stringCaptor.getValue());
271274

272-
assertAll("thread ID", () -> assertTrue(jsonObject.has("stack-trace"), "field exists"),
275+
assertAll("throwable", () -> assertTrue(jsonObject.has("throwable-class")),
276+
() -> assertThat("class", jsonObject.getString("throwable-class"),
277+
equalTo("java.lang.Throwable")), () -> assertTrue(jsonObject.has("throwable-message")),
278+
() -> assertThat("message", jsonObject.getString("throwable-message"),
279+
equalTo("test message")),
280+
() -> assertTrue(jsonObject.has("stack-trace"), "field exists"),
281+
() -> assertThat("field value", jsonObject.getString("stack-trace"), startsWith("*")));
282+
}
283+
284+
@DisplayName("Print a throwable without message")
285+
@Test
286+
void throwableWithoutMessage() {
287+
// given
288+
var throwable = mock(Throwable.class);
289+
290+
doAnswer(invocationOnMock -> {
291+
invocationOnMock.getArgument(0, PrintStream.class).println("*");
292+
return null;
293+
}).when(throwable).printStackTrace(isA(PrintStream.class));
294+
when(configuration.requestId()).thenReturn("request#");
295+
296+
// when
297+
loggerOutput.log(configuration, lambdaLogger, null, Level.ERROR, "test error message",
298+
throwable);
299+
300+
// then
301+
verify(lambdaLogger).log(stringCaptor.capture());
302+
303+
var jsonObject = new JSONObject(stringCaptor.getValue());
304+
305+
assertAll("throwable", () -> assertTrue(jsonObject.has("throwable-class")),
306+
() -> assertThat("class", jsonObject.getString("throwable-class"),
307+
equalTo("java.lang.Throwable")), () -> assertFalse(jsonObject.has("throwable-message")),
308+
() -> assertTrue(jsonObject.has("stack-trace"), "field exists"),
273309
() -> assertThat("field value", jsonObject.getString("stack-trace"), startsWith("*")));
274310
}
275311

0 commit comments

Comments
 (0)