如何解决将请求 ID 添加到 Micronaut 中的 slf4j 日志记录
问题
当请求进入服务器时,我想询问标头并查看是否有特定标头,如果有,我想获取该标头值并将其添加到 SLF4Js MDC,如果它不存在我将生成我自己的(见下面的代码)。
问题
我第一次使用 Micronaut (v2.5.5),使用 Spring Boot 有一段时间了。使用 Spring Boot,我能够添加一个 Filter 方法,该方法会将请求 ID 添加到 SLF4Js MDC 上下文,以便在记录的元素时将其包含在日志消息中。
示例
2021-07-01 19:12:57.104 LogLevel=INFOrid=3568b2d7-d8f1-4d7d-9e8d-49f2be727255,1 --- [nio-8080-exec-8] .....
这在 Micronaut 中失败了,我猜是因为请求可以在线程之间传递,并且 MDC 是特定于线程的。
示例
2021/01/07 18:50:05.021 信息 [qtp1561347421-43] c.c.dex.css.controllers.MyEndpointrid= - .....
Micronaut 中是否有任何机制可以支持此功能而无需切换到 Jaeger 等...?如果是,那是什么?
这是我试过的代码,它不起作用
@Slf4j
@Filter("/v1.0/**")
public class RequestId extends OncePerRequestHttpServerFilter {
public static final String X_REQUEST_ID = "X-REQUEST-ID";
public static final String RID = "rid";
@Override
protected Publisher<MutableHttpResponse<?>> doFilterOnce(HttpRequest<?> request,ServerFilterChain chain) {
// Was a request ID passed in,if so grab it
String requestID = request.getHeaders().get(X_REQUEST_ID);
if (null == requestID) {
// no create it
requestID = UUID.randomUUID().toString();
}
log.info("Storing RID in MDC and request: " + requestID);
MDC.put(RID,requestID);
}
我确实尝试将 rid 放在请求对象中(传递给 doFilter),然后在我的控制器中使用它,例如
@Controller(value = "v1.0/")
public class XmlEndpoint {
@Post(uri = "request")
public MyResponse request(@NonNull @Body(value = "MyRequest") MyRequest request) {
Optional<HttpRequest<Object>> optionalReq = ServerRequestContext.currentRequest();
if (optionalReq.isPresent()) {
HttpRequest<Object> curRequest = optionalReq.get();
// Get the request ID from the request
MDC.put(RequestId.RID,(String) curRequest.getAttribute(X_REQUEST_ID).orElse(UNKNowN_RID));
}
....
}
}
在这种情况下,日志消息包含 RID,但这似乎有点复杂。
我搜索了一下,看到了我想到的地方,但是有几个相关的问题;答案没有多大意义(Micronaut 新手,抱歉)或者似乎没有解决方案表明需要做什么。
- https://github.com/micronaut-projects/micronaut-core/issues/3106
- https://github.com/micronaut-projects/micronaut-core/issues/1669
- 其他 我还查看了讨论注释 @NewSpan 的文档,但这似乎专门用于分布式跟踪(Jaeger 和 Zipkin),所以我没有尝试。
提前致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。