在Log4j中,NDC和MDC有什么区别?我可以举一个使用它们的简单示例吗?

最佳答案

为了扩展Sikorski在注释中添加的link:
国家发展中心
在NDC中,N表示嵌套,这意味着您可以使用Stack控制单个值。您“推”一个字符串,然后在处理命令时可以“推”另一个字符串。处理完成后,您可以将其弹出以查看以前的值。这种上下文记录将在某些深度嵌套的处理中很有用。
设置上下文字符串

NDC.push("processingLevel2");
log.info("success");
这将在您的日志中得到%x(小写)模式的输出:
log4j.appender.CA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %C %x = %m%n
MDC
M代表映射,这为您提供了不同类型的控件。您可以使用名称/值对,而不是使用单个堆栈来控制单个上下文字符串。这对于跟踪多个上下文位很有用,例如将用户名和IP放入日志中。
设置映射值:
MDC.put("userIP", req.getRemoteAddr());
MDC.put("userName", foo.getName());
log.info("success");
MDC log4j模式示例
具有示例"userIP""userName"字符串的大写X。这些必须在您的代码和log4j配置中匹配:
log4j.appender.CA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSSS} %p %X{userIP}  %C %X{userName} = %m%n
我会将它们组合成一个)上下文字符串*。
相同点和不同点
在这两种情况下,无论何时执行log.info("success");,输出都会具有您提供的其他上下文。这比每次登录时都将log.info(req.getRemoteAddr()) + " success");这样的字符串串联起来要干净得多。
请注意,两者在线程和资源方面存在严重差异。特别是,如果您不努力弹出和清除NDC堆栈,则NDC将保留线程的句柄,这可能会影响资源的释放。
通过链接:如果不定期调用NDC.remove()方法,则使用NDC可能会导致内存泄漏。

关于logging - Log4j的NDC和MDC设施有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14134734/

10-10 00:35