diff --git a/aws-lambda-java-log4j2/pom.xml b/aws-lambda-java-log4j2/pom.xml index 6f142d57c..469c2e1f0 100644 --- a/aws-lambda-java-log4j2/pom.xml +++ b/aws-lambda-java-log4j2/pom.xml @@ -35,6 +35,7 @@ 1.8 1.8 2.25.4 + 5.12.2 @@ -60,8 +61,30 @@ log4j-api ${log4j.version} + + org.apache.logging.log4j + log4j-layout-template-json + ${log4j.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.2 + + + + dev @@ -146,4 +169,4 @@ - \ No newline at end of file + diff --git a/aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java b/aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java new file mode 100644 index 000000000..0bcd057a6 --- /dev/null +++ b/aws-lambda-java-log4j2/src/test/java/com/amazonaws/services/lambda/runtime/log4j2/LambdaAppenderPluginTest.java @@ -0,0 +1,86 @@ +/* Copyright 2026 Amazon.com, Inc. or its affiliates. All Rights Reserved. */ + +package com.amazonaws.services.lambda.runtime.log4j2; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class LambdaAppenderPluginTest { + + private final PrintStream originalOut = System.out; + private ByteArrayOutputStream captured; + + @BeforeEach + void redirectStdout() throws UnsupportedEncodingException { + captured = new ByteArrayOutputStream(); + System.setOut(new PrintStream(captured, true, StandardCharsets.UTF_8.name())); + } + + @AfterEach + void restoreStdout() { + System.setOut(originalOut); + } + + @Test + void lambdaAppenderEmitsLogsAtVariousLevels() throws UnsupportedEncodingException { + Logger logger = LogManager.getLogger(LambdaAppenderPluginTest.class); + + logger.debug("debug-msg"); + logger.info("info-msg"); + logger.warn("warn-msg"); + logger.error("error-msg"); + + String output = captured.toString(StandardCharsets.UTF_8.name()); + + // The PatternLayout in src/test/resources/log4j2.xml is "%-5p %c{1} - %m%n", + // so each event should appear as " LambdaAppenderPluginTest - ". + assertTrue(output.contains("DEBUG LambdaAppenderPluginTest - debug-msg"), + "expected DEBUG line in output but got:\n" + output); + assertTrue(output.contains("INFO LambdaAppenderPluginTest - info-msg"), + "expected INFO line in output but got:\n" + output); + assertTrue(output.contains("WARN LambdaAppenderPluginTest - warn-msg"), + "expected WARN line in output but got:\n" + output); + assertTrue(output.contains("ERROR LambdaAppenderPluginTest - error-msg"), + "expected ERROR line in output but got:\n" + output); + + // Sanity check: log4j should not have fallen back to its default + // ConsoleAppender / status logger error message. + assertFalse(output.contains("ERROR StatusLogger"), + "log4j status logger reported an error, output was:\n" + output); + } + + @Test + void lambdaAppenderEmitsJsonForJsonFormatLogger() throws UnsupportedEncodingException { + // The "json-test" logger is configured in src/test/resources/log4j2.xml + // with additivity=false to a second LambdaAppender using format="JSON" + // and JsonTemplateLayout backed by LambdaLayout.json. + Logger logger = LogManager.getLogger("json-test"); + + logger.info("json-info-msg"); + logger.error("json-error-msg"); + + String output = captured.toString(StandardCharsets.UTF_8.name()); + + assertTrue(output.contains("json-info-msg"), + "expected json-info-msg in output but got:\n" + output); + assertTrue(output.contains("json-error-msg"), + "expected json-error-msg in output but got:\n" + output); + + // Output should look like JSON, not the text PatternLayout from the + // root logger — so it must contain JSON field punctuation around the + // message rather than the "INFO json-test - ..." text pattern. + assertTrue(output.contains("\"message\":\"json-info-msg\""), + "expected JSON-encoded message field but got:\n" + output); + } +} diff --git a/aws-lambda-java-log4j2/src/test/resources/log4j2.xml b/aws-lambda-java-log4j2/src/test/resources/log4j2.xml new file mode 100644 index 000000000..7b43094e2 --- /dev/null +++ b/aws-lambda-java-log4j2/src/test/resources/log4j2.xml @@ -0,0 +1,25 @@ + + + + + + + %-5p %c{1} - %m%n + + + + + + + + + + + + + + + + + +