创建 log4j2 记录器会导致在启动 Tomcat webapp 时检索 JNDI 命名上下文失败
Creating a log4j2 Logger causes retrieval of JNDI naming context to fail when starting Tomcat webapp
我有一个 Java 7 网络应用程序,我正在尝试在服务器 运行ning Tomcat 7.0.53 上运行。在尝试使用 Log4j 之前,我的 webapp 已经能够启动并且 运行 没有任何问题。
现在,我正在尝试在我的应用程序中添加和使用 Log4j2。通过注释掉创建 Log4j Logger 的代码行,我发现当 Tomcat 尝试启动我的 webapp 时它会导致我的 webapp 失败。这是来自 catalina.out
的特定错误:
Oct 22, 2018 4:28:37 PM org.apache.catalina.deploy.NamingResources cleanUp
WARNING: Failed to retrieve JNDI naming context for container [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/db-status-checker]] so no cleanup was performed for that container
javax.naming.NamingException: No naming context bound to this class loader
由于查找 java:comp/env
失败而发生 NamingException。
这是导致上述警告和后续异常的特定代码行:
static Logger log = LogManager.getLogger(
DBTest.class.getName()
);
我用的 IDE 是 Intellij IDEA.
如果您需要更多信息,请告诉我。谢谢。
Please let me know if you need any more information.
在询问有关 Tomcat 的问题时,请务必说明您正在使用的 what exact version (x.y.z)。希望你的版本Tomcat7.0.z不是n岁
it is causing my webapp to fail when Tomcat attempts to start my webapp.
错误消息说它是通过方法 "org.apache.catalina.deploy.NamingResources cleanUp" 记录的。从名字就可以猜到,它不是在启动时发生,而是在关机时发生。
日志文件和其他日志文件(特别是localhost.log)中的其他消息是什么?
我的猜测是其他原因阻止它启动,清理错误只是其后果。
static Logger log
为什么"static"?仅当您有此 class 的多个实例(并希望跨实例共享记录器)时,这才有意义。如果只有一个实例(一个Servlet,一个Controller通常作为单个实例存在),使用实例字段更有意义。
一般说明:
- Common troubleshooting tips。您可以尝试在 NamingResources class 中放置一个断点并查看它是如何启动的。您可以尝试在 StandardContext class 中放置一个断点并查看它是如何启动的。 JNDI 在 StandardContext 启动序列的特定步骤初始化。
- 您可以尝试简化 Log4J 的配置。 (以确保它不在其配置中使用 JNDI)。
- 通常通过创建 InitialContext 并通过它进行查找来访问 JNDI。 InitialContext 根据它在其中运行的 Web 应用程序选择 JNDI 树。这是通过查看当前线程(又名 TCCL)的 Thread.getContextClassLoader() 来完成的。如果 TCCL 错误,JNDI 将无法访问。 (NamingResources class 是一个例外,因为它可以访问 Tomcat 内部结构)。
我有一个 Java 7 网络应用程序,我正在尝试在服务器 运行ning Tomcat 7.0.53 上运行。在尝试使用 Log4j 之前,我的 webapp 已经能够启动并且 运行 没有任何问题。
现在,我正在尝试在我的应用程序中添加和使用 Log4j2。通过注释掉创建 Log4j Logger 的代码行,我发现当 Tomcat 尝试启动我的 webapp 时它会导致我的 webapp 失败。这是来自 catalina.out
的特定错误:
Oct 22, 2018 4:28:37 PM org.apache.catalina.deploy.NamingResources cleanUp
WARNING: Failed to retrieve JNDI naming context for container [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/db-status-checker]] so no cleanup was performed for that container
javax.naming.NamingException: No naming context bound to this class loader
由于查找 java:comp/env
失败而发生 NamingException。
这是导致上述警告和后续异常的特定代码行:
static Logger log = LogManager.getLogger(
DBTest.class.getName()
);
我用的 IDE 是 Intellij IDEA.
如果您需要更多信息,请告诉我。谢谢。
Please let me know if you need any more information.
在询问有关 Tomcat 的问题时,请务必说明您正在使用的 what exact version (x.y.z)。希望你的版本Tomcat7.0.z不是n岁
it is causing my webapp to fail when Tomcat attempts to start my webapp.
错误消息说它是通过方法 "org.apache.catalina.deploy.NamingResources cleanUp" 记录的。从名字就可以猜到,它不是在启动时发生,而是在关机时发生。
日志文件和其他日志文件(特别是localhost.log)中的其他消息是什么?
我的猜测是其他原因阻止它启动,清理错误只是其后果。
static Logger log
为什么"static"?仅当您有此 class 的多个实例(并希望跨实例共享记录器)时,这才有意义。如果只有一个实例(一个Servlet,一个Controller通常作为单个实例存在),使用实例字段更有意义。
一般说明:
- Common troubleshooting tips。您可以尝试在 NamingResources class 中放置一个断点并查看它是如何启动的。您可以尝试在 StandardContext class 中放置一个断点并查看它是如何启动的。 JNDI 在 StandardContext 启动序列的特定步骤初始化。
- 您可以尝试简化 Log4J 的配置。 (以确保它不在其配置中使用 JNDI)。
- 通常通过创建 InitialContext 并通过它进行查找来访问 JNDI。 InitialContext 根据它在其中运行的 Web 应用程序选择 JNDI 树。这是通过查看当前线程(又名 TCCL)的 Thread.getContextClassLoader() 来完成的。如果 TCCL 错误,JNDI 将无法访问。 (NamingResources class 是一个例外,因为它可以访问 Tomcat 内部结构)。