L'autre jour ... j'ai rencontré un événement selon lequel le journal n'était pas sorti lors de l'arrêt de l'application Web: cry: J'écrirai la cause et la solution.
Les composants (composants approximatifs) de l'application dans laquelle cet événement s'est produit sont les suivants.
La cause était que "le processus d'arrêt de la fonction de sortie de journal de Logback" était appelé en premier dans le processus (processus de suppression) exécuté lorsque l'application Web était arrêtée.
En gros, le processus a été exécuté dans le flux suivant.
Logback (logback-classic) inclut une classe appelée LogbackServletContainerInitializer
, et lorsqu'elle est déployée sur un serveur d'applications prenant en charge Servlet 3.0 ou supérieur, la classe LogbackServletContextListener
est automatiquement enregistrée dans le conteneur de servlet. J'ai fait.
Dans ce cas, "Processus pour arrêter la fonction de sortie de journal de Logback" a été implémenté dans la méthode contextDestroyed
de LogbackServletContextListener
.
Dans ce cas ...
Avec un tel sentiment, il semble que "le processus d'arrêt de la fonction de sortie du journal de Logback" devrait être exécuté à la toute fin.
LogbackServletContextListener
Pour changer l'ordre de traitement ... Tout d'abord, désactivez la fonction d'enregistrement automatique de LogbackServletContextListener
. Il existe plusieurs façons de le désactiver, mais cette entrée vous montrera comment le désactiver à l'aide des paramètres du conteneur de servlet.
web.xml
<context-param>
<param-name>logbackDisableServletContainerInitializer</param-name>
<param-value>true</param-value>
</context-param>
NOTE:
Il peut également être désactivé à l'aide des propriétés système ou des variables d'environnement.
- http://logback.qos.ch/manual/configuration.html#webShutdownHook
LogbackServletContextListener
Après avoir désactivé l'enregistrement automatique, définissez la classe LogbackServletContextListener
avant la classe d'écouteur ( ContextLoaderListener
) pour initialiser / détruire le contexte d'application Spring.
<listener>
<listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
En faisant cela, (pour le moment ... dans Tomcat), après l'exécution du "processus de destruction du contexte d'application Spring", le "processus d'arrêt de la fonction de sortie du journal Logback" est maintenant exécuté.