如何从spring webflux WebFilter设置协同程序上下文?这是可能的吗?我知道我可以使用React器上下文,但我不能设置协同程序上下文。
更多详细信息:
我想使用MDCContext将MDC传播到slf 4j。例如,我想从HTTP头中获取MDC,然后我想将这些值自动传播到我编写的任何日志。
目前,我可以:
- 我在WebFilter中设置了reactor上下文
- 在每个控制器中,我从reactor上下文中获取值,并将它们放入MDCContext(协程)中
正如你所看到的,这不是很方便,因为我必须在控制器中添加额外的代码。
有没有一种方法可以自动将Reactor上下文转换为协程上下文?我知道我可以使用ContextInjector和ServiceLoader进行相反的转换(请参见https://github.com/Kotlin/kotlinx.coroutines/issues/284#issuecomment-516270570),但似乎没有这样的反向转换机制。
2条答案
按热度按时间sgtfey8w1#
和:Using ReactiveSecurityContextHolder inside a Kotlin Flow
更新3(2022年1月25日)
我已经创建了一个库来解决React式环境中的MDC LocalThread问题。我已经创建了一个特殊的Map实现MDC类,它在React式环境中运行。
https://github.com/Numichi/reactive-logger
更新1
在Kotlin协程中使用和添加上下文。
更新2(2021年12月25日)
我将Log4j 2与slf 4j一起使用。但是,我认为它可以在另一种实现中工作(例如:回登录)。
build.gradle.kts
(可选)如果您通过WebFlux使用WebFilter和writeContext。是否要将所有ReactorContext副本放入MDCContext中,请使用以下代码。您将在控制器的开始遇到包含所有ReactorContext元素的MDCContext。
如果你想使用@ExceptionHandler,MDCContext会丢弃你在控制器后面添加的所有值
MDC.put("key", "value")
,因为运行程序退出了挂起的作用域。它们的工作方式类似于代码变量和代码块。所以,我建议保存异常中的所有值,并从可抛出的示例中恢复到处理程序中。所以你可以使用MDCContext(或者在任何类中)。Ofc,不需要每次都调用
LoggerFactory.getLogger(javaClass)
。这也可以组织成属性。在log4j2.xml中,您可以引用MDC键并将其加载到此处。例如:
<PatternLayout pattern="%mdc{context_map_key}">
Log4J插件
使用
annotationProcessor
添加多个依赖项写plugin. Ofc,它是一个极简主义者:
还有log4j2.xml什么的。
iqxoj9l92#
很遗憾,现在还不可能。Spring框架中有一个开放的问题可以修复这个问题,您可以upvote -〉https://github.com/spring-projects/spring-framework/issues/26977