在web应用程序中如何传MDC的值

在web应用程序中如何传MDC的值

这篇文章主要介绍在web应用程序中如何传MDC的值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

传MDC的值

在web应用程序中如何传MDC的值

MDC(Mapped Diagnostic Context)通常用于存储单个任务的特定值。例如,在web应用程序中,它可能为每个请求存储一个请求id和一个用户id,因此MDC查找与单个请求或整个用户活动相关的日志记录变得更加容易。

2017-08-2714:38:30,893INFO[server-thread-0][requestId=060d8c7f,userId=2928ea66]c.g.s.web.Controller-Message.

可是如果代码的某些部分是在专用线程池中执行的,则线程(提交任务的线程)中MDC就不会被继续传值。在下面的示例中,第7行的日志中包含“requestId”,而第9行的日志则没有:

@GET@Path("/genre/{name}")@Produces(MediaType.APPLICATION_JSON)publicvoidgetGenre(@PathParam("name")StringgenreName,@SuspendedAsyncResponseresponse){try(MDC.MDCCloseableignored=MDC.putCloseable("requestId",UUID.randomUUID().toString())){StringgenreId=getGenreIdbyName(genreName);//Synccalllogger.trace("Submittingtasktofindgenrewithid'{}'.",genreId);//'requestId'isloggedexecutorService.submit(()->{logger.trace("Startingtasktofindgenrewithid'{}'.",genreId);//'requestId'isnotloggedResponseresult=getGenre(genreId)//Asynccall.map(artist->Response.ok(artist).build()).orElseGet(()->Response.status(Response.Status.NOT_FOUND).build());response.resume(result);});}}

这可以通过MDC#getCopyOfContextMap()方法来解决:

...publicvoidgetGenre(@PathParam("name")StringgenreName,@SuspendedAsyncResponseresponse){try(MDC.MDCCloseableignored=MDC.putCloseable("requestId",UUID.randomUUID().toString())){...logger.trace("Submittingtasktofindgenrewithid'{}'.",genreId);//'requestId'isloggedwithCopyingMdc(executorService,()->{logger.trace("Startingtasktofindgenrewithid'{}'.",genreId);//'requestId'islogged...});}}privatevoidwithCopyingMdc(ExecutorServiceexecutorService,Runnablefunction){Map

以上是“在web应用程序中如何传MDC的值”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-19 21:13:37
收藏
分享
海报
0 条评论
32
上一篇:java如何更改线程名称 下一篇:RGB和Lab色彩模型是什么
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码