How to populate custom field value for logback?

3.9k views Asked by At

I am trying to write one custom starter in sprintboot for logging. So that all downstream project can follow the same pattern of logging on adding starter in class path.

For this I am trying to create one logback.xml file and using LogstashEncoder. In this project I am using sleuth and zipking also so that I can see the traceId and spanId.

Following is the logback.xml file.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/console.xml"/>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p [Orders:%thread:%X{X-B3-TraceId}:%X{X-B3-SpanId}] %logger{40} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <appender name="fileout"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>c:/elk/orders4.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <maxIndex>8</maxIndex>
            <FileNamePattern>./logs/orders.log.%i
            </FileNamePattern>
        </rollingPolicy>e
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>128MB</MaxFileSize>
        </triggeringPolicy>

        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"tenantId":"log-odyssey"}</customFields>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="fileout" />
        <appender-ref ref="stdout" />
    </root>
</configuration>

Now If you will see in RollingFileAppender I am using one custom field with hardcode value. I want to populate its value dynamically from http request. as tenantId will be resolved from request itself.

Can someone help me to solve this issue how I can populate custom fields value dynamically.

1

There are 1 answers

0
Phil Clay On

Create a Servlet Filter that retrieves the tenantId from the request and populates the tenantId property in the logback MDC. LogstashEncoder will automatically include all properties from the MDC in the JSON output for a log event. You don't even need to define a custom field in xml.