Java ThreadContext.pop()抛出NoTouchElementException:ThreadContext堆栈在log4j-2.3中为空

Java ThreadContext.pop()抛出NoTouchElementException:ThreadContext堆栈在log4j-2.3中为空,java,log4j2,Java,Log4j2,我正在尝试从log4j-1.x升级到log4j-2.3,在运行时出现以下错误。我遗漏了什么 public void debug(String msg) { appendContext(); logger.debug(msg); ThreadContext.pop(); } [5/25/16 20:08:16:748 SGT]0000006a ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper服务S

我正在尝试从log4j-1.x升级到log4j-2.3,在运行时出现以下错误。我遗漏了什么

public void debug(String msg) {
    appendContext();
    logger.debug(msg);
    ThreadContext.pop();
}
[5/25/16 20:08:16:748 SGT]0000006a ServletWrappe E com.ibm.ws.webcontainer.servlet.ServletWrapper服务SRVE0068E:应用程序[DBIN中间件]中servlet[MWServlet]的一个服务方法引发异常。创建的异常:[java.util.NoSuchElementException:ThreadContext堆栈为空 位于org.apache.logging.log4j.spi.DefaultThreadContextStack.pop(DefaultThreadContextStack.java:185) 位于org.apache.logging.log4j.ThreadContext.pop(ThreadContext.java:391)


我找到了解决方案,在对其调用pop()之前,我们需要检查ThreadContext是否为空:


我找到了解决方案,在对其调用pop()之前,我们需要检查ThreadContext是否为空:


ThreadContext
对象既有堆栈对象又有映射对象。
ThreadContext.isEmpty()
是对映射的检查,而
ThreadContext.pop()则是对堆栈的检查

以下支票对我有效:

   if (!ThreadContext.getImmutableStack().isEmpty()) {
        ThreadContext.pop();
    }

ThreadContext
对象既有堆栈对象又有映射对象。
ThreadContext.isEmpty()
是对映射的检查,而
ThreadContext.pop()则是对堆栈的检查

以下支票对我有效:

   if (!ThreadContext.getImmutableStack().isEmpty()) {
        ThreadContext.pop();
    }

您是否在同一线程上向ThreadContextStack添加了一些内容?我尝试添加了一些内容,但仍然出现相同的错误您是否在同一线程上向ThreadContextStack添加了一些内容?我尝试添加了一些内容,但仍然出现相同的错误