我们正在使用:
春季靴
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/