Weblogic 12cで戦争を停止してから再開すると、独特の動作が発生しました。私の理解を超えた何らかの理由で、Log4j2はログへの書き込みを停止します。新しいログファイルが作成されますが、エントリは書き込まれません。
デバッグしたところ、戦争をインストールしたときと同じようにLog4jServletContainerInitializerとLog4jServletContextListenerが呼び出されることがわかりました。私は違いに気づきませんでした(残念ながら、それは私の注意力のテストにすぎません)。
では、Weblogic 12cのLog4J2に関して、インストールと起動で何が異なるのか、そしておそらくどこでエラーを探すのかについて、何か考えがありますか?
私の理解を超えた何らかの理由で、Log4j2はログへの書き込みを停止します。新しいログファイルが作成されますが、エントリは書き込まれません。
それは実際にいくつかの問題で起こります。
log4j.properties
ファイルで正しく行われていない場合。Log4J
とのような2つのロガーを使用する場合JUL
、同じappneder(Stdout)を使用します。回答-1:クラスパスには、Log4J呼び出しをインターセプトし、それらをJUL呼び出しに変換するライブラリの設定があります。次に、この問題が発生する可能性があります。したがって、実際に必要なインポートを正しく指定してください。java.util.logging.Logger
またはorg.apache.log4j.Logger
回答-2:プロパティはcase sensitive
です。だからあなたのfile name would be same with appender
。アペンダーをtrueにすることを忘れないでください。
log4j.appender.mainAppender.File=yourLogFile.log
log4j.appender.mainAppender.Append=true
Ans-3:特にHibernateの場合、すべてのロガーが確実に連携するように、slf4jを含めます。
回答-4:この問題はTomcatで発生することがあります。Tomcatセキュリティが有効になっていて、ポリシーファイルからいくつかのアクセス許可が欠落している場合、このタイプの問題が発生します。権限を付与した後、正常に動作します。
Log4Jは実際に何をしますか?
Log4Jは、情報以上のメッセージのみを出力し、コンソールとファイルの両方に出力します。に変更INFO
するとALL
、この動作を変更できますlog4j.rootLogger
。それが機能しない場合は-Dlog4j.debug=true
、JVM引数に追加します。これにより、Log4Jはそれ自体に関するデバッグメッセージを(System.outに)発行し、何が起こっているかを確認できます。クレジットは@に行くアイザック
log4j2の更新:
多くのおかげでrgoers log4j2のための問題を指しているため。更新中です。
arestart
がトリガーされると、DevToolsが実行され、登録されているすべてのシャットダウンフックがクリアされます。そのようなフックの1つがLog4J2DefaultShutdownCallbackRegistry
です。Log4jContextFactoryはへの参照を維持し、DefaultShutdownCallbackRegistry
LogManagerはLog4jContextFactoryへの静的参照を保持します。Log4J2's classes are loaded by the app classloader which means that there's a single LogManager, Log4jContextFactory, and DefaultShutdownCallbackRegistry shared across restarts.
場合はDefaultShutdownCallbackRegistry
、再起動の一部として実行され、それが停止LoggerContext
してまで、自身の状態を設定しますSTOPPED
。再起動が進むと、新しいものLoggerContext
が作成され、そのシャットダウンコールバックをレジストリに登録しようとします。レジストリの状態がまだであるため、これは失敗しますSTOPPED
。
Wilkinsonaは、この問題を解決するためのハッキング方法を提供しました。それを以下に示します。それに対処してみてください。
リスタータがJVMのシャットダウンフックを実行する前に、レジストリ内のコールバックをクリアすることをお勧めします。例外の発生を防ぎ、再起動後もログは引き続き機能します。
private void prepareLog4J2ForRestart() throws Exception {
if (ClassUtils.isPresent("org.apache.logging.log4j.LogManager",
getClass().getClassLoader())) {
LoggerContextFactory factory = LogManager.getFactory();
Field field = ReflectionUtils.findField(factory.getClass(),
"shutdownCallbackRegistry");
ReflectionUtils.makeAccessible(field);
ShutdownCallbackRegistry shutdownCallbackRegistry = (ShutdownCallbackRegistry) ReflectionUtils
.getField(field, factory);
Field hooksField = ReflectionUtils
.findField(shutdownCallbackRegistry.getClass(), "hooks");
ReflectionUtils.makeAccessible(hooksField);
@SuppressWarnings("unchecked")
Collection<Cancellable> state = (Collection<Cancellable>) ReflectionUtils
.getField(hooksField, shutdownCallbackRegistry);
state.clear();
}
}
期待される動作を得るために、JEEアプリケーションに追加するリスナーの種類は何ですか?
リスナーを書くために、あなたはチュートリアルに従うことができます
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加