我们正在使用:


春季靴
Slf4J
退回
ELK堆栈


现在,我们要使用MDC将POST请求JSON中提供的唯一跟踪号添加到给定请求的每个日志语句中。

我在Google上搜索了一些博客文章,这些文章对我没有太大帮助。

以下是我们正在使用的logback.xml

<configuration>
    <property name="PROJECT_ID" value="template-api"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>


任何人都可以提供有关如何完成此操作的帮助吗?

最佳答案

您可以使用Logback的Mapped Diagnotic Context将唯一的跟踪号传播到每个日志消息。

这有两个部分:


将您的唯一跟踪号码推入MDC,例如MDC.put("uniqueTrackingNumber", the_unique_tracking_number);
在您的日志语句中包括MDC条目。您可以通过在日志记录模式中指定它来执行此操作。因此,如果将唯一的跟踪号存储在名为uniqueTrackingNumber的MDC条目中,则可以通过定义如下布局将其包括在发出的日志事件中:


<layout class="ch.qos.logback.classic.PatternLayout">
    <Pattern>
        %d{yyyy-MM-dd HH:mm:ss} [%thread] [%X{uniqueTrackingNumber}] %-5level %logger{36} - %msg%n
    </Pattern>
</layout>


更多详细信息in the docs

我假设“唯一跟踪号”的范围仅限于一个请求(或整个应用程序中的单个“流”)?如果是这样,那么您将希望确定一些油门点,可以在其中推入MDC值。在Spring Boot的世界中,这很可能是Filter。可能是这样的:

@Component
public static class UniqueTrackingNumberFilter extends OncePerRequestFilter() {

    @Override
    protected abstract void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
                    throws ServletException, IOException {
        // presumably this is extracted from the request (or defaulted, if not supplied)
        int uniqueTrackingNumber = ;
        MDC.put("uniqueTrackingNumber", uniqueTrackingNumber);
    }
}


另外,您可以扩展Logback的MDCInsertingServletFilter以从请求中提取所需内容,然后将其推送到MDC中。

关于logging - 如何在Spring Boot中使用logback和SLF4J的MDC来捕获POST请求json中的唯一跟踪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59961811/

10-11 08:47