Configure the Java Application Loggers

Before you begin, review the Supported Log Frameworks.

For structured logs, the following MDC keys are included in the log object.

  • appd_node_id
  • appd_bt_id
  • appd_request_guid

This is an example of enrichment using the Logstash encoder.

<appender name="COMPOSITEJSONENCODER" class="ch.qos.logback.core.FileAppender">
<file>compositejsonencoder.log</file>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<fieldName>timestamp</fieldName>
<timeZone>UTC</timeZone>
</timestamp>
<loggerName>
<fieldName>logger</fieldName>
</loggerName>
<logLevel>
<fieldName>level</fieldName>
</logLevel>
<threadName>
<fieldName>thread</fieldName>
</threadName>
<mdc>
<includeMdcKeyName>appd_node_id</includeMdcKeyName>
<includeMdcKeyName>appd_bt_id</includeMdcKeyName>
<includeMdcKeyName>appd_request_guid</includeMdcKeyName>
</mdc>
<stackTrace>
<fieldName>stackTrace</fieldName>
<!-- maxLength - limit the length of the stack trace -->
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<maxDepthPerThrowable>200</maxDepthPerThrowable>
<maxLength>14000</maxLength>
<rootCauseFirst>true</rootCauseFirst>
</throwableConverter>
</stackTrace>
<message />
<throwableClassName>
<fieldName>exceptionClass</fieldName>
</throwableClassName>
</providers>
</encoder>
</appender>

For unstructured logs, the following MDC keys are included in the log object.

  • appd_node_id
  • appd_bt_id
  • appd_request_guid

Here are the appender examples for all the supported log frameworks.

Logback
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>app.log</file>
<append>false</append>
<immediateFlush>true</immediateFlush>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - appd_node_id=%X{appd_node_id} appd_bt_id=%X{appd_bt_id} appd_request_guid=%X{appd_request_guid} - %m%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
Log4j

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="FILE" class="org.apache.log4j.FileAppender">
<param name="File" value="logs/app.log"/>
<param name="Append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - appd_node_id=%X{appd_node_id} appd_bt_id=%X{appd_bt_id} appd_request_guid=%X{appd_request_guid} - %m%n"/>
</layout>
</appender>
<root>
<priority value="INFO"/>
<appender-ref ref="FILE"/>
</root>
</log4j:configuration>
Log4j2
<Configuration>
<Appenders>
<File name="FILE" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - appd_node_id=%X{appd_node_id} appd_bt_id=%X{appd_bt_id} appd_request_guid=%X{appd_request_guid} - %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="FILE"/>
</Root>
</Loggers>
</Configuration>