Kotlin Serverless Framework Logging Fix

OVERVIEW

If you are interested in using the Serverless Framework with Kotlin on AWS you will likely find the aws-kotlin-jvm-gradle.

For example this command will create a service:

serverless create --template aws-kotlin-jvm-gradle --path your_service

This template seems to work fine but I came accross an issue when attempting to debug errors in Cloudwatch. The errors will mention things like ERROR StatusLogger Unrecognized format specifier which is preceded by ERROR StatusLogger No log4j2 configuration file found

This was quite confusing as the base template contains the log4j configuration file and if you decompile the assembled binary that file does get packaged up for the deployment.

After digging around it looks like there is an issue with shadowJar and how it packages the file. The configuration file is packaged but just not correctly

As best I can tell there may be a recent change that broke Log4j2PluginsCacheFileTransformer and I just happened to come accross it at an unfortunate time.

THE FIX

Add the Log4j2PluginsCacheFileTransformer to your build.gradle file.

  • Add the plugin to the top of the file:
import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer
  • Add this before the build.finalizedBy(shadowJar) call:
shadowJar {
  transform(Log4j2PluginsCacheFileTransformer)
}

After making that change and redeploying the logs started flowing as they should.