Sto provando a scrivere un messaggio al logger che un servlet (Vaadin) è stato arrestato, utilizzando SLF4J e Log4j2.Nessun output di registro su contextDestroyed utilizzando ServletContextListener & SLF4J
Per questo sto utilizzando un ServletContextListener
che registra un messaggio all'avvio dell'applicazione. Tuttavia sono stato in grado di ottenere alcun output quando si accede all'interno del metodo contextDestroyed
... Qui è la mia realizzazione:
@WebListener
public class VaadinLogger implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(VaadinLogger.class);
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
// Remove appenders from JUL loggers
SLF4JBridgeHandler.removeHandlersForRootLogger();
// Install bridge
SLF4JBridgeHandler.install();
// Get servlet context
ServletContext context = contextEvent.getServletContext();
// Retrieve name
String name = context.getServletContextName();
// Log servlet init information
logger.info("Start \"{}\"", name);
}
@Override
public void contextDestroyed(ServletContextEvent contextEvent) {
// Get servlet context
ServletContext context = contextEvent.getServletContext();
// Retrieve name
String name = context.getServletContextName();
// Log servlet destroy information
logger.info("End \"{}\"{}", name, System.lineSeparator()));
// Uninstall bridge
SLF4JBridgeHandler.uninstall();
}
}
A questo punto, sto cercando di indovinare questo è probabilmente perché al punto contextDestroyed
si chiama, la registrazione non è più possibile perché sono già stati distrutti dal garbage collector.
Quindi ora la mia domanda è, è possibile registrare che il servlet si è fermato prima che il contesto venga distrutto, o fare eseguire il listener di contesto prima che i logger di log4j2 vengano distrutti?
Grazie in anticipo!
Se si dispone di un riferimento vivo al logger, allora non è garbage collection. Sei sicuro che il 'ServletContext' è stato effettivamente distrutto? Cosa sta causando la sua distruzione? – RealSkeptic
Spero che il contesto venga distrutto quando interrompo il server tomcat. Suppongo che funzioni perché 'SLF4JBridgeHandler.uninstall();' corretto alcuni errori nell'output della mia console .. Anche quando cambio 'logger.info (...' in 'System.out.println (...' il messaggio viene stampato sulla console – Kryptoxx
Hai chiuso con grazia il contenitore o hai interrotto bruscamente la JVM? Spesso vedo gli starter che usano Eclipse pensando che il pulsante rosso nella scheda * Console * bloccherebbe con grazia il contenitore, ma in realtà uccide immediatamente il JVM. Dovresti usare il pulsante rosso nella scheda * Servers * (o fare clic con il tasto destro sul server e scegliere "Stop") – BalusC