【问题标题】: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。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多