如何使用 slf4j 将 REST 错误与日志条目关联起来?

问题描述 投票:0回答:1

在后端代码中,当 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 和常见日志框架的实现。有没有我忽略的通用解决方案?

java rest logging slf4j
1个回答
1
投票

一种常见的方法是关联 ID 或请求 ID。为此通常使用两种常见的 HTTP 标头:

X-Request-ID
X-Correlation-ID
(请参阅 相应的
en.wikipedia.org
文章
)。

整个流程通常是这样的:

  • 编写一个
    filter
    (
    baeldung.com
    )
    ,为 http 请求生成相关 ID(如果尚不存在)。这保证了每个请求都有一个相关 ID,同时也为调用者提供了设置相关 ID 的可能性。
  • 还将相关 id 添加到 slf4j 的元数据上下文 (
    slf4.org
    )
    ,并配置 slf4j 以打印相关 id。
  • 构建响应时,还应包含相关 ID 作为 http 标头。这也可以通过另一个或与以前相同的过滤器来完成。
© www.soinside.com 2019 - 2024. All rights reserved.