Java Log4J:关闭挂钩上的致命异常,can';我不明白为什么

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

我刚刚将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.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"