我正试图在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将从请求本身解析。
有人能帮我解决这个问题吗?如何动态填充自定义字段值。
创建一个Servlet Filter,从请求中检索tenantId
并在logback MDC中填充tenantId
属性。LogstashEncoder将自动将MDC的所有属性包含在日志事件的JSON输出中。您甚至不需要在xml中定义自定义字段。