2015-11-21 11 views
6

(Vaadin)サーブレットが停止しているロガーに、SLF4JとLog4j2を使用してメッセージを書き込もうとしています。ServletContextListener&SLF4Jを使用してcontextDestroyedにログ出力がありません

私はServletContextListenerを使用しています。これは、アプリケーションの起動時にメッセージを記録します。しかし、私は私の実装です。ここ... contextDestroyedメソッド内でのログイン時に任意の出力を得ることができなかった:

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

この時点で、私はこれを推測している時点contextDestroyedで、ログと呼ばれているので、おそらくですすでにガベージコレクタによって破棄されているため、もう使用できません。

私の質問は、コンテキストが破棄される前にサーブレットが停止したことを記録するか、log4j2ロガーが破棄される前にコンテキストリスナーを実行させることですか?

ありがとうございます!

+0

あなたがロガーへのライブ参照を持っている場合は、それが収集したごみではありません。 'ServletContext'が実際に破棄されたことは確かですか?破壊の原因は何ですか? – RealSkeptic

+0

私はTomcatサーバーを停止するとコンテキストが破壊されることを望んでいます。私は 'SLF4JBridgeHandler.uninstall();'がコンソール出力にいくつかのエラーを修正したため、これはうまくいきました.. 'logger.info(...'を 'System.out.println(...')に変更すると – Kryptoxx

+0

あなたは正常にコンテナをシャットダウンしたのですか、またはJVMを突然終了させましたか?Eclipseを使って、* Console *タブの赤いボタンが正常にコンテナをシャットダウンすると思っていることがよくあります。 JVM。* Servers *タブの赤いボタンを使用するか(サーバーを右クリックして「停止」を選択してください) – BalusC

答えて

0

まず、クラスパスにlog4j 2.xのapi、core、webのjarファイルがありますか? log4j-web-2.x.jarは、Webアプリケーションのアンロード時にロギングサブシステムをシャットダウンするために使用されるコンテキストリスナーも登録します。

その後リスナーを実行すると、もう何もログに記録できなくなります。

log4j2設定ファイルで<Configuration status="trace" ...を設定すると、何が起きているのかを確認できます。

+0

ええ、すべてのjar(api、core、web)がクラスパスにロードされているので、問題ではありません。私が最初に何を得るのかを見るg! – Kryptoxx

0

log4j2(log4j-web-xx.jar)には、Webフラグメントが付属しています。このフラグメントにはServletContextListenerが含まれています。リスナーの順序は初期化によって異なります(Servlet Specification参照)。デフォルト:まずアプリケーション。

あなたは、あなたのweb.xmlに<absolut-ordering>を指定する順序を変更することができます。

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

も参照してください:servlet-30-web-fragmentxml

+0

提案をありがとう、私は明日それを試してみようとしています! – Kryptoxx

+0

私はこれを試しましたが、悲しいことに、これはうまくいきません... – Kryptoxx

関連する問題