我正在开发 spring boot 应用程序,我想在日志文件中记录具有唯一 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);
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) 将帮助您。您需要在收到请求后立即为每个请求生成 unitque 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 进行注释。
关于java - 如何使用唯一 ID 记录错误并在 rest 响应中发送该 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49693143/