如果我不从 MDC 中删除上下文数据会怎样?

What if I do not remove context data from MDC?

我知道,MDC 是一个映射,它存储上下文为 运行 的特定线程的上下文数据。我在 运行 的情况下,我希望每个日志语句都应该打印某些数据,这些数据不限于任何特定线程,而是特定于应用程序,例如。我的应用程序所在的当前节点名称 运行。所以我在 MDC

中添加了节点名称

MDC.put("source",source_name);

因为它是特定于应用程序的,所以我不想将其从 MDC 中删除(如果我的应用程序由于某种原因出现故障,如果我没记错的话,无论如何 MDC 都会被清除)。

只是想知道,如果我不从 MDC 中删除密钥会发生什么,它将如何影响我的应用程序?会不会有任何内存泄漏或类似的问题?

除了日志中会有一些不正确的 MDC 文本外,没有任何影响。比如thread1加入了MDC,那么任何使用thread1登出的日志都会有MDC的文本(当然也要看logback的配置)。

如果我不得不说,这对性能有轻微影响,因为 MDC 数据存储在 ThreadLocal 中。正如您提到的,ThreadLocal 就像一个使用线程作为键的 Map。 logging的时候会有get-like操作

并且不太可能发生内存泄漏,因为在您的情况下,只有非常有限的数据会放入 MDC,并且数据只是字符串(我想 source_name 是字符串)。

是的。如果应用程序以某种方式宕机,线程就会消失,并且没有 ThreadLocal,也没有 MDC。

希望这对您有所帮助。