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>
XML

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.


<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>
XML


<!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>
XML
<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>
XML