15

いくつかの Web アプリについて、log4j から logback に移行しています。アプリケーションのシャットダウンでは、現在以下を呼び出しています。

org.apache.log4j.LogManager.shutdown();

これは、すべての非同期ロギングをフラッシュし、すべての外部リソース (ファイル、ソケット) を閉じることになっています。

ログバックに似たようなものがありますか、それともシャットダウン時に何らかの方法で自動的にフラッシュしますか?

マイク

4

4 に答える 4

9

構成に追加<shutdownHook/>するだけでコンテキストが停止するようです。

logback ドキュメントから:

<configuration>
   <!-- in the absence of the class attribute, assume 
   ch.qos.logback.core.hook.DelayingShutdownHook -->
   <shutdownHook/>
  .... 
</configuration>

そしてDelayingShutdownHook の要約から:

指定された遅延の後に Logback コンテキストを停止する ShutdownHook 実装。デフォルトの遅延は 0 ミリ秒 (ゼロ) です。

于 2015-07-24T11:34:39.493 に答える
8

簡単なアプローチは次のとおりです。

import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;

...

ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
// Check for logback implementation of slf4j
if (loggerFactory instanceof LoggerContext) {
    LoggerContext context = (LoggerContext) loggerFactory;
    context.stop();
}
于 2011-05-04T13:44:04.600 に答える
0

log4j のような全体的なマネージャーのシャットダウンについては認識していませんが、次のように ServletContextListener を使用してコンテキストが破棄されたときに、個々のコンテキスト ロガーをすべて閉じます。

ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector();
LoggerContext context = selector.detachLoggerContext(contextName);
if (context != null) {
    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
    context.reset();
} else {
    System.err.printf("No context named %s was found", contextName);
}

また、 LoggerContext.stop() は有効で、内部で同じ機能をいくつか実行しますが、私は使用していないため、リセットよりも優れているかどうかについてコメントすることはできません。

于 2010-09-09T17:27:49.603 に答える