问题描述
问题
当请求进入服务器时,我想询问标头并查看是否有特定标头,如果有,我想获取该标头值并将其添加到 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 (将#修改为@)