'Log4j2 + AWS JAVA LAMBDA + CLOUD WATCH LOGS
I am using the following configurations in my code but cloudwatch logs are not getting generated. Log4j2.xml is present in main/resources. I am following the AWS documentation and some stack overflow but I am not getting the logs it says -
Cloudwatch Logs
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
START RequestId: e36-c827-46-93-a7 Version: $LATEST
Transforming org/apache/logging/log4j/core/lookup/JndiLookup (lambdainternal.CustomerClassLoader@433d)
2022-03-07T16:01:51.527+05:30 2022-03-07 10:31:51,526 main ERROR Error processing element Lambda ([Appenders: null]): CLASS_NOT_FOUND
2022-03-07T16:01:51.626+05:30 2022-03-07 10:31:51,626 main ERROR Unable to locate appender "Lambda" for logger config "root"
Log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.amazonaws.services.lambda.runtime.log4j2" status="WARN">
<Appenders>
<Lambda name="Lambda">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n</pattern>
</PatternLayout>
</Lambda>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Lambda" />
</Root>
<Logger name="software.amazon.awssdk" level="WARN" />
<Logger name="software.amazon.awssdk.request" level="DEBUG" />
</Loggers>
</Configuration>
Gradle Dependencies used:
implementation 'org.apache.logging.log4j:log4j-api:2.17.2'
implementation 'org.apache.logging.log4j:log4j-core:2.17.2'
runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.0'
runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
Service class Logging Declaration
@Slf4j
public class ABC {
public void method1(){
log.info(" HELLO WORLD ________ ");
}
}
Please help.
Solution 1:[1]
alternatively, You can use the Context object to get a logger like below
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class MyClass implements RequestHandler<Map<String, Object>, Void> {
@Override
public Void handleRequest(Map<String, Object> inputRequest, Context context) {
LambdaLogger logger = context.getLogger();
logger.log("Hello ");
}}
Solution 2:[2]
Changing these lines:
runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.0'
runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
To
implementation 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.0'
implementation 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
Solved this problem for me
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Srinivas Nangana |
Solution 2 | Nick Sutton |