2015-11-21 15 views
6

Ich versuche, eine Nachricht an den Logger schreiben, dass ein (Vaadin) Servlet gestoppt wurde, dies mit SLF4J und Log4j2.Keine Protokollausgabe auf ContextDestroyed mit ServletContextListener & SLF4J

Dafür verwende ich eine ServletContextListener, die eine Meldung protokolliert, wenn die Anwendung gestartet wurde. Allerdings habe ich es nicht gelungen, eine Ausgabe zu erhalten, wenn innerhalb der contextDestroyed Methode Anmeldung ... Hier ist meine Implementierung ist:

@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(); 
    } 
} 

An dieser Stelle Ich vermute, dies ist wahrscheinlich, weil an der Stelle contextDestroyed genannt wird, Protokollierung ist nicht mehr möglich, da sie bereits vom Müllsammler zerstört wurden.

So meine Frage ist, ist es möglich, entweder zu protokollieren, dass das Servlet gestoppt wurde, bevor der Kontext zerstört wird, oder den Contextlistener ausführen, bevor Log4j2 Logger zerstört werden?

Vielen Dank im Voraus!

+0

Wenn Sie eine Live-Bezug auf den Logger haben, dann gesammelt nicht Müll es ist. Sind Sie sicher, dass der 'ServletContext' tatsächlich zerstört wurde? Was verursacht seine Zerstörung? – RealSkeptic

+0

Ich hoffe, der Kontext wird zerstört, wenn ich den Tomcat-Server stoppe. Ich denke, das funktioniert, weil 'SLF4JBridgeHandler.uninstall();' einige Fehler in meiner Konsolenausgabe behoben hat. Auch wenn ich 'logger.info (...' in 'System.out.println (...' die Nachricht – Kryptoxx

+0

Haben Sie den Container ordnungsgemäß heruntergefahren, oder haben Sie die JVM abrupt beendet? Oft sehe ich Anfänger, die Eclipse denken, dass die rote Schaltfläche auf der Registerkarte * Console den Container ordnungsgemäß herunterfährt, aber es tötet sofort den JVM: Sie sollten stattdessen die rote Taste auf der Registerkarte * Servers * verwenden (oder klicken Sie mit der rechten Maustaste auf den Server und wählen Sie "Stop") – BalusC

Antwort

0

Erstens, haben Sie die log4j 2.x API-, Core- und Web-Jars in Ihrem Klassenpfad? Die log4j-web-2.x.jar registriert auch einen Context-Listener, der zum Herunterfahren des Logging-Subsystems verwendet wird, wenn die Web-App entladen wird.

Wenn Ihr Listener danach ausgeführt wird, können Sie nichts mehr anmelden.

Sie können überprüfen, was passiert, indem Sie in Ihrer log4j2-Konfigurationsdatei <Configuration status="trace" ... einstellen.

+0

Yeah alle Gläser (api, Kern, Web) werden in den Klassenpfad geladen, so dass das nicht das Problem sein sollte.Ich werde versuchen, den Status zu verfolgen und zu setzen Sehen Sie, was ich als erstes am Morgen bekomme G! – Kryptoxx

0

log4j2 (log4j-web-xx.jar) wird mit einem Web-Fragment geliefert. Dieses Fragment enthält einen ServletContextListener. Die Reihenfolge der Listener hängt von der Initialisierung ab (siehe Servlet Specification). Standard: Ihre Anwendung zuerst, dann andere.

kann Ihr die Reihenfolge ändern, eine <absolut-ordering> in Ihrem web.xml angeben:

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

Siehe auch: servlet-30-web-fragmentxml

+0

Danke für den Vorschlag, ich werde es morgen versuchen und lassen Sie es wissen! – Kryptoxx

+0

Ich habe das versucht, aber leider funktioniert das nicht ... – Kryptoxx