当前位置: 首页 > 知识库问答 >
问题:

如何在创建者日志时添加 MDC

燕凯旋
2023-03-14

我正在尝试将一个值设置为MDC,以便在有日志的情况下显示在每个日志行中。如果kafka producer中有info(“”),那么日志就不会显示我之前为MDC添加的值。

我有一个拦截器来为correlationId设置“默认值”

 @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                         Object handler) {
    MDC.put("correlationId", "correlation-id-to-be-set");
    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                       @Nullable ModelAndView modelAndView){
    MDC.clear();
}

我设置了 MDC 相关 Id 值,当它进入控制器时。

    @RequestMapping(value = "/notifications", method = RequestMethod.POST, produces = {"application/json"})
@ResponseStatus(HttpStatus.CREATED)
@RolesAllowed({"ROLE_CREATE_NOTIFICATION"})
@LogMethodExecutionTime
public @ResponseBody
OutboundNotificationEvent createNotification(@Valid @RequestBody OutboundNotificationEvent notificationRequest,
                                             HttpServletRequest request){

    log.info("Request Received. CorrelationId {} ",notificationRequest.getCorrelationId());
    if(notificationRequest.getCorrelationId()!=null)
        MDC.put("correlationId", notificationRequest.getCorrelationId());

    bpmProducer.sendMessage(ArgosUtils.mapNotificationPayloadToBpmEvent(notificationRequest, MSG_RECEIVED, EVENT_RECEIVED));

仅用于Kafka日志不包括之前添加的 MDC 消息

2022-06-08 10:15:31.616 INFO { correlation id = correlation-id-to-be-set } 19608-[nio-8080-exec-2]. a . c . unsubscribed notifications controller:请求已收到。correlation id HQ 12345678888 2022-06-08 10:15:33.734信息{ } 19608-[rest-services-1]c . u . b . u . n . a . p .取消订阅AlertsProducer:消息已成功发送2022-06-08 10:15:33.735信息{ } 19608-[rest-services-1]c . u . b . u . n . Argos . producer

因此,正如您在时间戳之后的日志中看到的那样,{}内有一个INFO {}应该是MDC值,该值仅出现在nio-8080-exec-2线程中,从BpmProducer和取消订阅的警报器触发的日志(这是用于Kafka生成事件的类)不包括先前添加的MDC值。我的问题是我需要做什么才能在每个日志行中显示reactId,如果有任何问题,请让我知道,提前感谢。

共有1个答案

况胡媚
2023-03-14

您的项目中应该有一个日志回溯配置文件(回溯Spring.xml)。在此文件中,我们可以配置包级记录器。

示例:在下面的配置中,将为com的DEBUG日志打印mdc键。并将打印其他软件包的INFO日志的mdc密钥。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="RFA">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <includeCallerData>true</includeCallerData>
      <includeMdcKeyName>url</includeMdcKeyName>
      <includeMdcKeyName>service</includeMdcKeyName>
      <includeMdcKeyName>userId</includeMdcKeyName>
    </encoder>
    <file>logs/service.log</file>
  </appender>


  <springProfile name="!production">
    <logger additivity="false" level="DEBUG" name="com.company"> //check this
      <appender-ref ref="RFA"/>
    </logger>
    <root level="INFO">
      <appender-ref ref="RFA"/>
    </root>
  </springProfile>

</configuration>
 类似资料:
  • 我使用serenity BDD进行自动化测试,使用页面对象模型进行框架测试。我创建了一个BasePage类,它将被所有其他页面继承。我想通过添加所有日志来最小化来自页面的日志消息。将信息消息发送到中央基本页。例如,在调用click()方法时,我将在basePage类中记录单击前和单击后的方法,如下所示: 公共类BasePage扩展了PageObject{ 后来我发现,与其单独尝试预先确定用户将在w

  • 是否有一种方法可以将时间戳添加到。pm2/logs中的错误日志中? 我注意到命令显示带有时间戳的聚合日志,但查看日志文件时,只有消息和stacktraces没有日期。

  • 我很高兴地使用SLF4J和logback和使用2个附加为根记录器。 stdout的调试级别 文件的信息级别 所有日志都需要成为输出的一部分(因此需要根记录器)。

  • 我好像拿不到滚动日志文件。 我的logback.xml配置有以下内容: 有意思。SIFT中“unknown.log”文件中的条目在分钟的停止处停止。之后,不会向SIFT文件写入任何内容,但我一直在catalina.out中获取条目:

  • 本文向大家介绍C# 如何添加错误日志信息,包括了C# 如何添加错误日志信息的使用技巧和注意事项,需要的朋友参考一下 系统日志 系统日志包含了由Windows系统组件记录的事件。例如,在启动期间装入驱动程序或其他系统组件失败被记录到系统日志。要查看系统日志: 打开命令提示符。 在提示符下输入eventvwr。这打开了Windows事件查看器。 应用程序日志 应用程序日志包含了由应用程序或程序记录的事

  • 我在我的Spring启动应用程序中使用了开放遥测java自动检测。有没有办法让应用程序日志成为创建的跨度的一部分? 我的自动配置设置如下: