2015-11-21 59 views
6

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!

+0

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

+0

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

+0

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

risposta

0

Per prima cosa, hai il log4j 2.x api, core e web jars nel classpath? Log4j-web-2.x.jar registra anche un listener di contesto utilizzato per arrestare il sottosistema di registrazione quando l'app Web viene scaricata.

Se l'ascoltatore viene eseguito dopo, non sarà più possibile registrare nulla.

È possibile controllare cosa sta accadendo impostando <Configuration status="trace" ... nel file di configurazione log4j2.

+0

Sì, tutti i jar (api, core, web) sono caricati nel classpath, quindi non dovrebbe essere il problema. Proverò a utilizzare lo stato per tracciare e vedere quale risultato ottengo la prima cosa al mattino g! – Kryptoxx

0

log4j2 (log4j-web-xx.jar) viene fornito con un frammento web. Questo frammento contiene un ServletContextListener. L'ordine degli ascoltatori dipende dall'inizializzazione (vedere Servlet Specification). Predefinito: la tua applicazione prima di altre.

tuo possibile modificare l'ordine per specificare un <absolut-ordering> in web.xml:

<web-app> 
    <absolute-ordering> 
    <name>log4j</name> 
    <others/> 
    </absolute-ordering> 

Vedi anche: servlet-30-web-fragmentxml

+0

Grazie per il suggerimento, ci proverò domani e ti faccio sapere! – Kryptoxx

+0

Ho provato questo, ma purtroppo questo non funziona ... – Kryptoxx