2

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

MDC.put("source",source_name);

由于它是特定于应用程序的,我不想将其从 MDC 中删除(如果我的应用程序由于某种原因出现故障,如果我没有错,任何方式 MDC 都会被清除)。

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

4

1 回答 1

2

除了日志中会出现一些不正确的 MDC 文本外,没有任何影响。例如,将 MDC 添加到 thread1,然后使用 thread1 注销的任何日志都将具有 MDC 文本(当然它也取决于 logback 配置)。

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

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

是的。如果不知何故应用程序出现故障,线程消失,没有 ThreadLocal,也没有 MDC。

希望这可以帮助。

于 2017-01-11T14:15:43.013 回答