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

问题描述 投票:2回答:2

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

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

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

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

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

java logging slf4j mdc
2个回答
1
投票

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


0
投票

只有MDC.clear和MDC.remove的不同之处在于:clear将从ThreadContextMap中删除所有条目(每个线程MDC保留的地图)如果存在则删除将仅删除ThreadContextMap中的一个键。

但是既然你提到“来自一个没有任何MDC的图书馆”

请把这个检查:

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

and if (MDC.getMDCAdapter() != null) MDC.put();
© www.soinside.com 2019 - 2024. All rights reserved.