java - 如何使用唯一 ID 记录错误并在 rest 响应中发送该 ID?

标签 java spring-boot logging

我正在开发 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 是合理的默认值),并将此值放入 M​​DC。实现细节取决于您使用的日志记录框架

回退示例: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/

相关文章:

java - 我不知道输入是否为空要打印

rest - Spring Data Rest with Spring Security - 按当前用户查找所有

java - 带有可迭代的 Spring 数据 findAllBy 返回空数组

java - 如何仅为休息 Controller 更改基本网址?

python - 登录多线程

JavaScript AJAX 远程记录器

python - 记录 setLevel 被忽略

java.sql.SQLException : Parameter index out of range (1 > number of parameters, 为 0)。使用 PreparedStatement 时

java - 创建 elasticsearch 客户端抛出 netty IllegalStateException

java - 从 Tomcat 9 到客户端的 Websocket 二进制消息拆分为 2 个或更多 tcp 数据包