Java Log4J:关闭挂钩上的致命异常,can';我不明白为什么
我刚刚将log4j集成到我的应用程序中,我正在设置AspectJ来使用log4j,并最终将所有日志从我的主代码中转移出来。因此,简而言之,我正在设置执行日志项的方面,然后在短时间内运行我的程序来测试它们 通常,在这些短期运行期间,我会遇到以下异常:Java Log4J:关闭挂钩上的致命异常,can';我不明白为什么,java,log4j,log4j2,Java,Log4j,Log4j2,我刚刚将log4j集成到我的应用程序中,我正在设置AspectJ来使用log4j,并最终将所有日志从我的主代码中转移出来。因此,简而言之,我正在设置执行日志项的方面,然后在短时间内运行我的程序来测试它们 通常,在这些短期运行期间,我会遇到以下异常: 2015-09-28 15:21:48,222 Thread-4 FATAL Unable to register shutdown hook because JVM is shutting down. java.lang.IllegalStateE
2015-09-28 15:21:48,222 Thread-4 FATAL Unable to register shutdown hook because JVM is shutting down. java.lang.IllegalStateException: Cannot add new shutdown hook as this is not started. Current state: STOPPED
at org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry.addShutdownCallback(DefaultShutdownCallbackRegistry.java:113)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.addShutdownCallback(Log4jContextFactory.java:271)
at org.apache.logging.log4j.core.LoggerContext.setUpShutdownHook(LoggerContext.java:240)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:201)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:233)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:41)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:162)
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:507)
at org.jboss.logging.Log4j2Logger.<init>(Log4j2Logger.java:36)
at org.jboss.logging.Log4j2LoggerProvider.getLogger(Log4j2LoggerProvider.java:30)
at org.jboss.logging.Log4j2LoggerProvider.getLogger(Log4j2LoggerProvider.java:26)
at org.jboss.logging.Logger.getLogger(Logger.java:2465)
at org.jboss.logging.Logger$1.run(Logger.java:2565)
at java.security.AccessController.doPrivileged(Native Method)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2529)
at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516)
at org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:28)
at org.hibernate.internal.CoreLogging.messageLogger(CoreLogging.java:24)
at org.hibernate.event.internal.ReattachVisitor.<clinit>(ReattachVisitor.java:27)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:227)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:92)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:647)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:639)
at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:634)
at io.craigmiller160.stockmarket.controller.HibernatePortfolioDAO.savePortfolio(HibernatePortfolioDAO.java:225)
at io.craigmiller160.stockmarket.controller.StockMarketController.savePortfolio(StockMarketController.java:1441)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:353)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:276)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:578)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:554)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingleton(DefaultListableBeanFactory.java:925)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:523)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.destroySingletons(DefaultListableBeanFactory.java:932)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:997)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:973)
at org.springframework.context.support.AbstractApplicationContext$1.run(AbstractApplicationContext.java:893)
如果您需要查看其他信息以确定原因,请告诉我。这种情况并不总是发生,但当程序运行10-20秒时,这种情况会非常频繁。我不明白为什么会发生这种情况。Log4j2请尝试使用以正确关闭日志服务
关闭挂钩是并行执行的,这就是为什么异常不是系统性的
关于这个问题,有一个共同的看法
您可以在配置文件中禁用关机挂钩:
<configuration shutdownHook="disable" ...>
另请参见log4j2页面上的此链接: 如果包含此依赖项,它将不会尝试添加关闭挂钩
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j.version}</version>
</dependency>
org.apache.logging.log4j
log4jweb
${log4j.version}
这是一个已知的问题。Log4j现在将在关机期间使用SimpleLogger。请参阅。正如这里已经提到的log4jweb
是解决此问题的jar。对于jetty-9.2.1.v20140609
,它可以正常工作
libraryDependencies += "org.apache.logging.log4j" % "log4j-web" % "2.5"
如果您检查,则它具有log4j.shutdownHookEnabled=false
但是使用Servlet3.0
和Tomcat7.0.73
,必须从conf/catalina.properties的jarsToSkip
键中删除log4j
可能会发生奇怪的事情。至于我,我正在部署两个。war
s,都使用非阻塞记录器
,为一个服务工作,但不为另一个服务工作<代码>Tomcat7
/WebSphere8
重新启动清理了它
需要清理日志资源的原因在-
当Servlet容器
关闭或web应用程序取消部署时,
正确清理日志资源非常重要
(数据库连接关闭、文件关闭等)
由于web应用程序中类加载器的性质,Log4j资源不能
通过正常方式清理。当web启动时,必须“启动”Log4j
应用程序部署并在web应用程序取消部署时“关闭”
请阅读这篇文章,它很有帮助。看起来是什么原因导致了弹簧损坏。好的,很酷,谢谢。在那之后,我应该做些什么来手动配置关机钩子吗?这些链接可能很有用:注意:似乎log4jweb2.6
是我需要的()
libraryDependencies += "org.apache.logging.log4j" % "log4j-web" % "2.5"