0

我正在尝试在 sprintboot 中编写一个自定义启动器以进行日志记录。这样所有下游项目都可以遵循在类路径中添加启动器的相同登录模式。

为此,我尝试创建一个 logback.xml 文件并使用 LogstashEncoder。在这个项目中,我还使用了 sleuth 和 zipking,这样我就可以看到 traceId 和 spanId。

以下是 logback.xml 文件。

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

现在,如果您将在 RollingFileAppender 中看到,我正在使用一个带有硬编码值的自定义字段。我想从 http 请求动态填充它的值。因为tenantId 将从请求本身解决。

有人可以帮我解决这个问题如何动态填充自定义字段值。

4

1 回答 1

0

创建一个 Servlet 过滤器,该过滤器tenantId从请求中检索 并填充logback MDCtenantId中的属性。LogstashEncoder 将自动在日志事件的 JSON 输出中包含来自 MDC 的所有属性。您甚至不需要在 xml 中定义自定义字段。

于 2020-12-09T19:10:00.437 回答