为了账号安全,请及时绑定邮箱和手机立即绑定

创建 log4j2 Logger 导致在启动 Tomcat webapp

创建 log4j2 Logger 导致在启动 Tomcat webapp

慕码人2483693 2021-12-01 19:18:32
我有一个 Java 7 webapp,我正在尝试在运行 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 cleanUpWARNING: Failed to retrieve JNDI naming context for container [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/db-status-checker]] so no cleanup was performed for that containerjavax.naming.NamingException: No naming context bound to this class loaderNamingException 发生是因为查找java:comp/env失败。这是导致上述警告和后续异常的特定代码行:static Logger log = LogManager.getLogger(            DBTest.class.getName()    );我使用的 IDE 是 Intellij IDEA。如果您需要更多信息,请告诉我。谢谢你。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

如果您需要更多信息,请告诉我。

在询问有关 Tomcat 的问题时,指定您使用的确切版本(xyz)很重要。希望你的Tomcat 7.0.z版本不是n年。

当 Tomcat 尝试启动我的 webapp 时,它导致我的 webapp 失败。

错误消息说它是由方法“org.apache.catalina.deploy.NamingResources cleanUp”记录的。正如您从名称中猜到的那样,它不会在启动时发生,而是在关闭时发生。

日志文件和另一个日志文件(特别是 localhost.log)中的其他消息是什么?

我的猜测是其他原因阻止它启动,而清理错误只是其后果。

静态记录器日志

为什么是“静态”?仅当您有此类的多个实例(并希望跨实例共享记录器)时,这才有意义。如果只有一个实例(一个 Servlet,一个 Controller 通常作为单个实例存在),使用实例字段更有意义。

一般注意事项:

  1. 常见故障排除技巧。您可以尝试在 NamingResources 类中放置一个断点并查看它是如何启动的。您可以尝试在 StandardContext 类中放置一个断点并查看它是如何启动的。JNDI 在 StandardContext 启动序列的某个步骤初始化。

  2. 您可以尝试简化 Log4J 的配置。(以确保它不在其配置中使用 JNDI)。

  3. 通常通过创建 InitialContext 并通过它进行查找来访问 JNDI。InitialContext 根据它在其中运行的 Web 应用程序选择 JNDI 树。这是通过查看当前线程(又名 TCCL)的 Thread.getContextClassLoader() 来完成的。如果 TCCL 错误,JNDI 将无法访问。( NamingResources 类是一个例外,因为它可以访问 Tomcat 内部结构)。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 240 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信