diff --git a/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java b/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java new file mode 100644 index 000000000..c99239648 --- /dev/null +++ b/src/test/java/org/apache/logging/log4j/core/layout/LambdaJsonLayoutTest.java @@ -0,0 +1,72 @@ +package org.apache.logging.log4j.core.layout; + +import java.io.IOException; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.Map; +import java.util.stream.Stream; + +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestHandler; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import software.amazon.lambda.handlers.PowerLogToolEnabled; + +import static java.util.Collections.emptyMap; +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; + +class LambdaJsonLayoutTest { + + private RequestHandler handler = new PowerLogToolEnabled(); + + @Mock + private Context context; + + @BeforeEach + void setUp() throws IOException { + initMocks(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(); + } + + @Test + void shouldLogInStructuredFormat() throws IOException { + handler.handleRequest("test", context); + + assertThat(Files.lines(Paths.get("target/logfile.json"))) + .hasSize(1) + .allSatisfy(line -> assertThat(parseToMap(line)) + .containsEntry("functionName", "testFunction") + .containsEntry("functionVersion", "1") + .containsEntry("functionMemorySize", "10") + .containsEntry("functionArn", "testArn") + .containsKey("timestamp") + .containsKey("message") + .containsKey("service")); + } + + private Map parseToMap(String stringAsJson) { + try { + return new ObjectMapper().readValue(stringAsJson, Map.class); + } catch (JsonProcessingException e) { + fail("Failed parsing logger line " + stringAsJson); + return emptyMap(); + } + } + + private void setupContext() { + when(context.getFunctionName()).thenReturn("testFunction"); + when(context.getInvokedFunctionArn()).thenReturn("testArn"); + when(context.getFunctionVersion()).thenReturn("1"); + when(context.getMemoryLimitInMB()).thenReturn(10); + } +} \ No newline at end of file diff --git a/src/test/java/software/amazon/lambda/handlers/PowerLogToolEnabled.java b/src/test/java/software/amazon/lambda/handlers/PowerLogToolEnabled.java index 04a81fe8b..4eb5b8a8a 100644 --- a/src/test/java/software/amazon/lambda/handlers/PowerLogToolEnabled.java +++ b/src/test/java/software/amazon/lambda/handlers/PowerLogToolEnabled.java @@ -2,13 +2,17 @@ import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import software.amazon.lambda.logging.PowerToolsLogging; public class PowerLogToolEnabled implements RequestHandler { + private final Logger LOG = LogManager.getLogger(PowerToolLogEventEnabled.class); @Override @PowerToolsLogging public Object handleRequest(Object input, Context context) { + LOG.info("Test event"); return null; } diff --git a/src/test/resources/log4j2.xml b/src/test/resources/log4j2.xml index 033da8a11..108e32b75 100644 --- a/src/test/resources/log4j2.xml +++ b/src/test/resources/log4j2.xml @@ -1,9 +1,9 @@ - + - +