【问题标题】:What if I do not remove context data from MDC?如果我不从 MDC 中删除上下文数据怎么办?
【发布时间】:2017-05-26 07:41:05
【问题描述】:
我知道,MDC 是一个映射,它存储上下文正在运行的特定线程的上下文数据。我正在运行的情况是,我希望每个日志语句都应该打印某些数据,这些数据不限于任何特定线程,而是特定于应用程序,例如。我的应用程序正在运行的当前节点名称。所以我在 MDC 中添加了节点名称
MDC.put("source",source_name);
由于它是特定于应用程序的,我不想将其从 MDC 中删除(如果我的应用程序由于某种原因出现故障,如果我没有错,任何方式都会清除 MDC)。
只是想知道,如果我不从 MDC 中删除密钥会发生什么以及它将如何影响我的应用程序?会不会有任何内存泄漏或类似情况??
【问题讨论】:
标签:
java
logging
slf4j
mdc
【解决方案1】:
除了日志中出现一些不正确的 MDC 文本外,没有任何影响。例如,将 MDC 添加到 thread1,然后使用 thread1 注销的任何日志都将具有 MDC 文本(当然它也取决于 logback 配置)。
如果我不得不说,由于 MDC 数据存储在 ThreadLocal 中,因此会对性能产生轻微影响。正如您所提到的,ThreadLocal 就像一个使用线程作为键的 Map。登录的时候会有get-like操作。
而且不太可能发生内存泄漏,因为在您的情况下,只有非常有限的数据放入 MDC,并且数据只是字符串(我想 source_name 是字符串)。
是的。如果不知何故应用程序出现故障,线程消失,没有 ThreadLocal,也没有 MDC。
希望这会有所帮助。