[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/aws/aws-lambda-java-libs/main/aws-lambda-java-log4j2/README.md [Back]  [Original]

# Using log4j2 with AWS Lambda

**IMPORTANT: The v1.6.3 release contained a regression (see [#612](https://github.com/aws/aws-lambda-java-libs/issues/612)) resulting in missing logs. Please upgrade to v1.6.4 or later. We apologize for the inconvenience.**

### 1. Pull in log4j2 dependencies

Example for Maven pom.xml

```xml

  ...
  
    com.amazonaws
    aws-lambda-java-log4j2
    1.6.5
  
  
    org.apache.logging.log4j
    log4j-core
    2.25.5
  
  
    org.apache.logging.log4j
    log4j-api
    2.25.5
  
  
    org.apache.logging.log4j
    log4j-layout-template-json
    2.25.5
  
  ....

```

If using maven shade plugin, set the plugin configuration as follows

```xml

  ...
  
    org.apache.maven.plugins
    maven-shade-plugin
    3.6.1
    
      
        package
        
          shade


        com.github.edwgiz
        maven-shade-plugin.log4j2-cachefile-transformer
        2.8.1


  ...

```

If you are using the [John Rengelman](https://github.com/johnrengelman/shadow) Gradle shadow plugin, then the plugin configuration is as follows:

```groovy

dependencies{
  ...
    implementation group: 'com.amazonaws', name: 'aws-lambda-java-log4j2', version: '1.6.5'
    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: log4jVersion
    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: log4jVersion
}

jar {
    enabled = false
}
shadowJar {
    transform(com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer)
}

build.dependsOn(shadowJar)

```

If you are using the `sam build` and `sam deploy` commands to deploy your lambda function, then you don't
need to use the shadow jar plugin. The `sam` cli-tool merges itself the `Log4j2Plugins.dat`
files.

### 2. Configure log4j2 using log4j2.xml file

Add the following file `/src/main/resources/log4j2.xml`

```xml


          %d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n


```

If the `AWS_LAMBDA_LOG_FORMAT` is set to `JSON`, the `LambdaJSONFormat` formatter will be applied, otherwise the `LambdaTextFormat`.

### 3. Example code

```java
package example;

import com.amazonaws.services.lambda.runtime.Context;

import static org.apache.logging.log4j.CloseableThreadContext.put;
import org.apache.logging.log4j.CloseableThreadContext.Instance;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Hello {
    // Initialize the Log4j logger.
    static final Logger logger = LogManager.getLogger(Hello.class);

    public String myHandler(String name, Context context) {
        // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch).
        System.out.println("log data from stdout \n this is continuation of system.out");

       // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch).
        System.err.println("log data from stderr. \n this is a continuation of system.err");

        // Use log4j to log the same thing as above and AWS Lambda will log only one event in CloudWatch.
        logger.debug("log data from log4j debug \n this is continuation of log4j debug");

        logger.error("log data from log4j err. \n this is a continuation of log4j.err");

        // When logging in JSON, you can also add custom fields
        // In java11+ you can use the `try (var ctx = put("name", name)) {}` structure
        Instance ctx = put("name", name);
        logger.info("log line with input name");
        ctx.close();

        // Return will include the log stream name so you can look
        // up the log later.
        return String.format("Hello %s. log stream = %s", name, context.getLogStreamName());
    }
}
```

Web Proxy Viewer  |  New URL  |  Original Page