(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ロガーが破棄される前にコンテキストリスナーを実行させることですか?
ありがとうございます!
あなたがロガーへのライブ参照を持っている場合は、それが収集したごみではありません。 'ServletContext'が実際に破棄されたことは確かですか?破壊の原因は何ですか? – RealSkeptic
私はTomcatサーバーを停止するとコンテキストが破壊されることを望んでいます。私は 'SLF4JBridgeHandler.uninstall();'がコンソール出力にいくつかのエラーを修正したため、これはうまくいきました.. 'logger.info(...'を 'System.out.println(...')に変更すると – Kryptoxx
あなたは正常にコンテナをシャットダウンしたのですか、またはJVMを突然終了させましたか?Eclipseを使って、* Console *タブの赤いボタンが正常にコンテナをシャットダウンすると思っていることがよくあります。 JVM。* Servers *タブの赤いボタンを使用するか(サーバーを右クリックして「停止」を選択してください) – BalusC