微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将请求 ID 添加到 Micronaut 中的 slf4j 日志记录

如何解决将请求 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 新手,抱歉)或者似乎没有解决方案表明需要做什么。

提前致谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。