我在Spring Boot应用程序上工作,我想在日志文件中记录具有唯一ID的异常并发送该ID以响应用户,因此用户可以提供该ID来支持团队,他们可以通过搜索此ID从文件中获取日志。

我正在使用@ControllerAdvice处理错误全局性我正在打印日志,如下所示
我尚未配置记录器,仅在默认情况下使用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

  protected static final Logger logger = LoggerFactory.getLogger(RestResponseEntityExceptionHandler.class);
  logger.error("Error",ex);


例外对象

其打印日志如下

2018-04-06 17:45:37.566 ERROR [micro-app,912f0faf43795429,912f0faf43795429,false] 8660 --- [nio-9530-exec-1] d.d.c.RestResponseEntityExceptionHandler : Error

javax.ws.rs.ClientErrorException: entity.notFound
    at com.ge.managers.impl.AssetCompanyRelationshipManager.get(AssetCompanyRelationshipManager.java:139) ~[classes/:na]


micro-app是我的应用程序名称,但是912f0faf43795429,912f0faf43795429这是什么ID?对于每个错误而言,它是唯一的,我如何访问它们并进行响应发送。

如果无法将此ID用作唯一的参考错误,请提出可能的建议。

谢谢

最佳答案

考虑使用https://cloud.spring.io/spring-cloud-sleuth/(分布式跟踪)

如果您不想使用新库,而只想用唯一的ID注释每个日志,则嵌套诊断上下文(NDC)或映射诊断上下文(MDC)将为您提供帮助。您需要在收到请求后立即为每个请求生成唯一ID(UUID是明智的默认设置),并将此值放入MDC。实现细节取决于您使用的日志记录框架

登录示例:https://logback.qos.ch/manual/mdc.html

log4j的示例:http://www.baeldung.com/java-logging-ndc-log4j

请注意,子线程不会自动继承MDC / NDC的副本。因此,如果将处理传递给新线程,则需要传递并再次设置MDC / NDC中的值(内部使用ThreadLocal)。

配置日志模式时(在记录器配置文件中),可以使用MDC / NCD值。这样,每个日志都将用您的请求ID进行注释。

10-01 00:27
查看更多