Spring @PreDestroy:没有记录,因为Logback过早停止

时间:2017-11-08 15:51:28

标签: java spring logback logback-classic

在我的项目中,我使用Logback作为日志工具。我有以下课程

destroy()

现在,我取消部署servlet。发生异常时,Logback不会打印消息和堆栈跟踪。这是因为在Spring调用15:46:19,084 |-INFO in ch.qos.logback.classic.servlet.LogbackServletContextListener@7957fe56 - About to stop ch.qos.logback.classic.LoggerContext [default] 之前,Logback正在清理。取消部署servlet时,这是第一个(也是最后一个)日志行:

System.out.println("...");

我通过在destroy()中添加<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.0.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>99-empty</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jcl</artifactId> </dependency> </dependencies> 来验证Logback是否先停止。

有什么方法可以解决这个问题吗?

我的依赖项:

spring-jcl

请注意,commons-logging用于将slf4j路由到logback(将路由到jcl-over-slf4j)。我没有使用interface Occupations { duration: number; id_entity: number; id_job: number; id_user: number; salary: number; start_time: number; } occupationDoc:AngularFirestoreDocument<Occupations>; occupation: Observable<Occupations>;

2 个答案:

答案 0 :(得分:5)

要禁用documented way以禁用注册>>> binascii.unhexlify(s) b'Ao\x1cy\x18\xf8:O\x19"\xd8m\xf5\xe7\x83H'

  

您可以禁用自动安装   通过设置命名的LogbackServletContextListener   web应用程序中的logbackDisableServletContainerInitializer   web.xml文件。这是相关的片段。

LogbackServletContextListener
     

请注意,logbackDisableServletContainerInitializer变量也可以设置为Java系统属性和OS环境变量。最本地的设置具有优先级,即首先是web-app,第二是系统属性,最后是OS环境。

我想你可能想要编写自己的关机钩子,如果是这种情况并停止LoggerContext

答案 1 :(得分:0)

拿起Dovmo的答案。这一切都与订购有关。我在Tomcat 8.5.x上遇到了同样的问题。在细菌方面,初始化程序会执行addListener,您无法控制监听程序。在关闭时,Tomcat反向迭代该列表,首先选择Logback侦听器:Spring不会记录任何内容。

自定义侦听器无法提供帮助,因为您无法预先添加它。在Tomcat上对我有用的是:

<listener>
    <listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>
</listener>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>logbackDisableServletContainerInitializer</param-name>
    <param-value>true</param-value>
</context-param>