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!
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
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
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