22
33import com .amazonaws .services .lambda .runtime .LambdaRuntime ;
44import com .amazonaws .services .lambda .runtime .LambdaRuntimeInternal ;
5+
56import com .amazonaws .services .lambda .runtime .LambdaLogger ;
7+ import com .amazonaws .services .lambda .runtime .logging .LogFormat ;
8+ import com .amazonaws .services .lambda .runtime .logging .LogLevel ;
69
10+ import org .apache .logging .log4j .Level ;
711import org .apache .logging .log4j .core .Filter ;
812import org .apache .logging .log4j .core .Layout ;
913import org .apache .logging .log4j .core .LogEvent ;
1014import org .apache .logging .log4j .core .appender .AbstractAppender ;
1115import org .apache .logging .log4j .core .config .plugins .Plugin ;
16+ import org .apache .logging .log4j .core .config .plugins .PluginAttribute ;
1217import org .apache .logging .log4j .core .config .plugins .PluginBuilderFactory ;
18+ import org .apache .logging .log4j .core .config .plugins .PluginElement ;
1319
1420import java .io .Serializable ;
21+ import java .util .HashMap ;
22+ import java .util .Map ;
1523
1624/**
1725 * Class to append log4j2 logs from AWS Lambda function to CloudWatch
2028@ Plugin (name = LambdaAppender .PLUGIN_NAME , category = LambdaAppender .PLUGIN_CATEGORY ,
2129 elementType = LambdaAppender .PLUGIN_TYPE , printObject = true )
2230public class LambdaAppender extends AbstractAppender {
31+ static {
32+ LambdaRuntimeInternal .setUseLog4jAppender (true );
33+ }
2334
2435 public static final String PLUGIN_NAME = "Lambda" ;
2536 public static final String PLUGIN_CATEGORY = "Core" ;
2637 public static final String PLUGIN_TYPE = "appender" ;
2738
2839 private LambdaLogger logger = LambdaRuntime .getLogger ();
2940
41+ private static LogFormat logFormat = LogFormat .TEXT ;
42+
43+ private static final Map <Level , LogLevel > logLevelMapper = new HashMap <Level , LogLevel >() {{
44+ put (Level .TRACE , LogLevel .TRACE );
45+ put (Level .DEBUG , LogLevel .DEBUG );
46+ put (Level .INFO , LogLevel .INFO );
47+ put (Level .WARN , LogLevel .WARN );
48+ put (Level .ERROR , LogLevel .ERROR );
49+ put (Level .FATAL , LogLevel .FATAL );
50+ }};
51+
3052 /**
3153 * Builder class that follows log4j2 plugin convention
3254 * @param <B> Generic Builder class
3355 */
3456 public static class Builder <B extends Builder <B >> extends AbstractAppender .Builder <B >
3557 implements org .apache .logging .log4j .core .util .Builder <LambdaAppender > {
3658
59+ @ PluginAttribute (value = "format" , defaultString = "TEXT" )
60+ LogFormat logFormat ;
61+ @ PluginElement ("LambdaTextFormat" )
62+ private LambdaTextFormat lambdaTextFormat ;
63+ @ PluginElement ("LambdaJsonFormat" )
64+ private LambdaJsonFormat lambdaJsonFormat ;
65+
3766 /**
3867 * creates a new LambdaAppender
3968 * @return a new LambdaAppender
4069 */
4170 public LambdaAppender build () {
42- return new LambdaAppender (super .getName (), super .getFilter (), super .getOrCreateLayout (),
43- super .isIgnoreExceptions ());
71+ Layout <?> layout ;
72+ if (logFormat == LogFormat .TEXT ) {
73+ layout = lambdaTextFormat != null ? lambdaTextFormat .getLayout () : super .getOrCreateLayout ();
74+ } else {
75+ layout = lambdaJsonFormat != null ? lambdaJsonFormat .getLayout () : super .getOrCreateLayout ();
76+ }
77+ return new LambdaAppender (super .getName (), super .getFilter (), layout , super .isIgnoreExceptions ());
4478 }
4579 }
4680
@@ -63,14 +97,22 @@ public static <B extends Builder<B>> B newBuilder() {
6397 */
6498 private LambdaAppender (String name , Filter filter , Layout <? extends Serializable > layout , boolean ignoreExceptions ) {
6599 super (name , filter , layout , ignoreExceptions );
66- LambdaRuntimeInternal .setUseLog4jAppender (true );
100+ }
101+
102+ /**
103+ * Converts log4j Level into Lambda LogLevel
104+ * @param level the log4j log level
105+ * @return Lambda log leve
106+ */
107+ private LogLevel toLambdaLogLevel (Level level ) {
108+ return logLevelMapper .getOrDefault (level , LogLevel .UNDEFINED );
67109 }
68110
69111 /**
70112 * Append log event to System.out
71113 * @param event log4j event
72114 */
73115 public void append (LogEvent event ) {
74- logger .log (super . getLayout ().toByteArray (event ));
116+ logger .log (getLayout ().toByteArray (event ), toLambdaLogLevel ( event . getLevel () ));
75117 }
76118}
0 commit comments