在处理开始时而不是在结束时调用MDC.clear()有什么缺点吗?

时间:2017-02-10 12:25:07

标签: java logging slf4j mdc

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

所以我的问题是,我这样做有什么不利吗?在处理开始与结束时,总是将上下文清理为经验法则。

要清楚我是否从头开始编写代码,我会做类似的事情:

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

但有时我必须使用基类或库中没有任何MDC相关代码的东西,因此我按照我的描述这样做,因为我不想复制基础来自库的类只是为了添加一些MDC代码行......

2 个答案:

答案 0 :(得分:1)

建议对此保持谨慎。如果您参考应用程序的开头,则没有意义,MDC当时没有任何内容。我猜您的引用位于请求的开头,但在这种情况下,如果您这样做,可能会有其他请求并行处理,清除MDC会影响所有其他请求的记录。您可以在每个请求结束时调用MDC.remove()。如果不知道您的确切应用,我可以建议这一点。

答案 1 :(得分:0)

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

但是,由于您提到“来自没有任何MDC的库”

请勾选此支票:

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

and if (MDC.getMDCAdapter() != null) MDC.put();