这是一个很好的问题!很遗憾 log4j 没有在这里帮助你。但是我们可以狡猾地使用 log4j 来修复 log4j!重要的概念是诊断上下文:
private static final String IN_APPEND_KEY = MyAppender.class.getName() + ".inAppend";
public void append(LoggingEvent e) {
if (e.getMDC(IN_APPEND_KEY) != null) return;
MDC.put(IN_APPEND_KEY, this);
try {
<your code here>
} finally {
MDC.remove(IN_APPEND_KEY);
}
}
您基本上想要设置一个标志,该标志将随着您的附加程序的执行流程“旅行”。至少在理论上,这正是诊断上下文所做的。它是线程本地的并且可以跨线程继承。精心编写的代码甚至可以跨其他边界保留上下文,例如消息队列。这将是多么酷:您的附加程序将日志消息放在 HTTP 请求队列中,队列保存诊断上下文并在请求运行时恢复它,HTTP 库记录错误,您的附加程序仍然检测到循环!这几乎是你能要求的最好的东西。