4

我喜欢在我的应用程序中使用 MDC 日志记录字段,因为它使查找所有相关的日志行变得非常容易。我还发现在处理开始时 clear() MDC 上下文要容易得多,因为我知道我的应用程序的入口点在哪里,但是我或其他开发人员可能忘记调用 MDC.clear( )。

所以我的问题是,我这样做有什么缺点吗?根据经验,在处理开始与结束时始终清除上下文。

要清楚,如果我是从头开始编写代码,我会这样做:

MDC.put();
try {
...
} finally {
  MDC.clear();
}

但有时我必须使用基类或库中没有任何 MDC 相关代码的东西,所以我按照我描述的方式这样做,因为我不想从库中复制基类只是为了添加几行 MDC 代码...

4

2 回答 2

1

MDC.clear 和 MDC.remove 的唯一区别是: clear 将从 ThreadContextMap 中删除所有条目(每个线程 MDC 保留的映射) remove 将仅从 ThreadContextMap 中删除一个键(如果存在)。

但是既然您提到“来自没有任何 MDC 的库”

请把这张支票:

if (MDC.getMDCAdapter() != null) MDC.clear();

and if (MDC.getMDCAdapter() != null) MDC.put();
于 2019-02-15T07:20:23.697 回答
1

建议对此保持谨慎。如果您指的是应用程序的开始,那是没有意义MDC的,那时也没有任何东西。我猜你的参考是在请求的开头,但在这种情况下,如果你这样做,可能会有其他请求被并行处理,并且清除MDC会影响所有其他请求的日志记录。MDC.remove()您可以在每个请求结束时调用。在不知道您的确切应用程序的情况下,这就是我所能建议的。

于 2017-02-10T12:54:13.540 回答