在后端代码中,当 REST 端点方法产生异常时,端点应返回具有适当 http 错误状态的有效负载,例如 500。REST 响应的有效负载不应包含异常本身也是一个好习惯因为这可能会泄露安全信息。记录异常也是以后调试的好习惯。
我们想要做的是从 REST 调用返回一个有效负载,该有效负载稍后可以与日志条目相关联。做到这一点的一种方法是采用如下所示的模式:
// next line would be nice, but doesn't work
long timestampOfLogEntry = LOGGER.error("Unexpected error in REST call", exception);
// return a REST payload with the timestamp - so we can lookup the error later
return status(INTERNAL_SERVER_ERROR, new response("Unexpected error", timestampOfLogEntry))
但是,LOGGER 方法具有“void”返回类型,而不是返回时间戳或任何可以在以后本机用于识别日志条目的内容。
一种解决方案是捕获我们自己的时间戳并将其包含在日志中,但这对于记录器框架自动创建的时间戳来说是多余的。我们还可以创建某种随机数以包含在日志和返回负载中,但这会增加日志的噪音。
这似乎是所有 REST 端点实现的普遍问题,至少是那些使用 Java 和常见日志框架的实现。有没有我忽略的通用解决方案?
一种常见的方法是关联 ID 或请求 ID。为此通常使用两种常见的 HTTP 标头:
X-Request-ID
和 X-Correlation-ID
(请参阅 相应的 en.wikipedia.org
文章)。
整个流程通常是这样的:
filter
(baeldung.com
),为 http 请求生成相关 ID(如果尚不存在)。这保证了每个请求都有一个相关 ID,同时也为调用者提供了设置相关 ID 的可能性。slf4.org
),并配置 slf4j 以打印相关 id。