diff --git a/pom.xml b/pom.xml
index a7009e3e0..623a81e38 100644
--- a/pom.xml
+++ b/pom.xml
@@ -190,6 +190,12 @@
3.17.2
test
+
+ org.skyscreamer
+ jsonassert
+ 1.5.0
+ test
+
org.aspectj
aspectjtools
diff --git a/powertools-logging/pom.xml b/powertools-logging/pom.xml
index 038f6a31d..f2b210636 100644
--- a/powertools-logging/pom.xml
+++ b/powertools-logging/pom.xml
@@ -103,6 +103,16 @@
assertj-core
test
+
+ com.amazonaws
+ aws-lambda-java-events
+ test
+
+
+ org.skyscreamer
+ jsonassert
+ test
+
\ No newline at end of file
diff --git a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java
index ec3f64165..8414d5307 100644
--- a/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java
+++ b/powertools-logging/src/main/java/software/amazon/lambda/powertools/logging/internal/LambdaLoggingAspect.java
@@ -23,6 +23,7 @@
import java.util.Optional;
import java.util.Random;
+import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
@@ -37,6 +38,7 @@
import software.amazon.lambda.powertools.logging.PowertoolsLogging;
import static java.util.Optional.empty;
+import static java.util.Optional.of;
import static java.util.Optional.ofNullable;
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.coldStartDone;
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.extractContext;
@@ -147,7 +149,8 @@ private Object[] logEvent(final ProceedingJoinPoint pjp) {
if (isHandlerMethod(pjp)) {
if (placedOnRequestHandler(pjp)) {
Logger log = logger(pjp);
- log.info(pjp.getArgs()[0]);
+ asJson(pjp, pjp.getArgs()[0])
+ .ifPresent(log::info);
}
if (placedOnStreamHandler(pjp)) {
@@ -171,7 +174,9 @@ private Object[] logFromInputStream(final ProceedingJoinPoint pjp) {
args[0] = new ByteArrayInputStream(bytes);
Logger log = logger(pjp);
- log.info(MAPPER.readValue(bytes, Map.class));
+
+ asJson(pjp, MAPPER.readValue(bytes, Map.class))
+ .ifPresent(log::info);
} catch (IOException e) {
Logger log = logger(pjp);
@@ -181,6 +186,16 @@ private Object[] logFromInputStream(final ProceedingJoinPoint pjp) {
return args;
}
+ private Optional asJson(final ProceedingJoinPoint pjp,
+ final Object target) {
+ try {
+ return ofNullable(MAPPER.writeValueAsString(target));
+ } catch (JsonProcessingException e) {
+ logger(pjp).error("Failed logging event of type {}", target.getClass(), e);
+ return empty();
+ }
+ }
+
private Logger logger(final ProceedingJoinPoint pjp) {
return LogManager.getLogger(pjp.getSignature().getDeclaringType());
}
@@ -188,7 +203,7 @@ private Logger logger(final ProceedingJoinPoint pjp) {
private static Optional getXrayTraceId() {
final String X_AMZN_TRACE_ID = getenv("_X_AMZN_TRACE_ID");
if(X_AMZN_TRACE_ID != null) {
- return ofNullable(X_AMZN_TRACE_ID.split(";")[0].replace("Root=", ""));
+ return of(X_AMZN_TRACE_ID.split(";")[0].replace("Root=", ""));
}
return empty();
}
diff --git a/powertools-logging/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java b/powertools-logging/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java
index 4db93fd34..5fc0398d1 100644
--- a/powertools-logging/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java
+++ b/powertools-logging/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java
@@ -39,7 +39,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.Mockito.when;
-import static org.mockito.MockitoAnnotations.initMocks;
+import static org.mockito.MockitoAnnotations.openMocks;
class LambdaJsonLayoutTest {
@@ -50,7 +50,7 @@ class LambdaJsonLayoutTest {
@BeforeEach
void setUp() throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
- initMocks(this);
+ openMocks(this);
setupContext();
//Make sure file is cleaned up before running full stack logging regression
FileChannel.open(Paths.get("target/logfile.json"), StandardOpenOption.WRITE).truncate(0).close();
diff --git a/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/handlers/PowerLogToolEnabled.java b/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/handlers/PowerLogToolEnabled.java
index 5678c0e95..097d26756 100644
--- a/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/handlers/PowerLogToolEnabled.java
+++ b/powertools-logging/src/test/java/software/amazon/lambda/powertools/logging/handlers/PowerLogToolEnabled.java
@@ -20,7 +20,7 @@
import software.amazon.lambda.powertools.logging.PowertoolsLogging;
public class PowerLogToolEnabled implements RequestHandler