2015-11-21 21 views
6

kullanarak LogDestroyed Loger'e bir (Vaadin) sunucu uygulamasının durdurulduğunu, bu SLF4J ve Log4j2'yi kullanarak bir ileti yazmaya çalışıyorum.Içerikte günlük çıktısı yok ServletContextListener & SLF4J

Bunun için, uygulama başlatıldığında bir ileti kaydeden bir ServletContextListener kullanıyorum. Ancak contextDestroyed yönteminin içine giriş herhangi bir çıktı alamıyor olmuştur ... İşte benim uygulamasıdır: Bu noktada

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

, ben noktada contextDestroyed de denir, çünkü bu muhtemelen günlüğü tahmin ediyorum artık mümkün değil çünkü çöp toplayıcı tarafından çoktan imha edildi.

Şimdi benim sorum şu ki, oturumun bağlamı yok edilmeden önce sunucu uygulamasının durduğunu veya log4j2 günlükleri yok edilmeden önce contextlistener uygulamasının yürütülmesini sağlamak mümkün mü?

Şimdiden teşekkürler!

+0

Eğer günlükçüsüne canlı başvuru varsa, o zaman çöp toplandı değil. ServletContext'in gerçekten yok edildiğinden emin misiniz? Yıkımına neden olan nedir? – RealSkeptic

+0

Tomcat sunucusunu durdurduğumda bağlamın zarar görmesini umuyorum. Bunun çalıştığını düşünüyorum çünkü 'SLF4JBridgeHandler.uninstall();' konsol çıktısında bazı hatalar düzeltildi. Ayrıca 'logger.info (… '' '' '' '' '' '' '' '' '' '' '' '' '. '.printprintprintln (((((((((((((((((... konsola yazdırılır – Kryptoxx

+0

Konteyneri incelikle kapattın mı yoksa JVM'yi aniden mi sonlandırdın mı? Sık sık Eclipse'i kullanarak * Console * sekmesindeki kırmızı düğmenin kapsayıcıyı kapatacağını düşünürken, hemen hemen JVM. * Sunucular * sekmesindeki kırmızı düğmeyi kullanmalısınız (ya da sağ tıklatma sunucusu ve "Durdur" u seçmelisiniz.) – BalusC

cevap

0

İlk olarak, sınıf yolunuzda log4j 2.x api, çekirdek ve web kavanozları var mı? Log4j-web-2.x.jar ayrıca, web uygulaması kaldırıldığında günlüğe kaydetme alt sistemini kapatmak için kullanılan bir içerik dinleyicisi kaydeder.

Eğer dinleyiciniz bundan sonra çalışırsa, artık bir şeyleri kaydedemezsiniz.

Log4j2 yapılandırma dosyanızda <Configuration status="trace" ... ayarını yaparak neler olup bittiğini kontrol edebilirsiniz.

+0

Evet tüm kavanozlar (api, çekirdek, web) sınıf yoluna yüklenir, bu yüzden sorun olmamalıdır. Sabahın ilk çıkışını aldığım çıktıya bakın g! – Kryptoxx

0

log4j2 (log4j-web-xx.jar) bir web parçasıyla birlikte gelir. Bu parça bir ServletContextListener içerir. Dinleyicilerin sırası, başlatma işlemine bağlıdır (bkz. Servlet Specification). Varsayılan: Uygulamanız önce diğerleri.

Senin sizin web.xml''deki bir <absolut-ordering> belirtmek için sırasını değiştirebilirsiniz:

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

Ayrıca bakınız: servlet-30-web-fragmentxml

+0

Öneri için teşekkürler, yarın deneyeceğim ve öğreneyim! – Kryptoxx

+0

Bunu denedim ama ne yazık ki bu işe yaramıyor ... – Kryptoxx

İlgili konular