2

コマンドライン処理の結果に応じて、最初にログをオフにしてからコマンドラインを解析し、後で再びオンにする可能性のあるJavaコマンドラインツールがあります。

主な方法は次のように始まります。

public static void main(final String[] args){
    java.util.logging.LogManager.getLogManager().reset();
    java.util.logging.Logger globalLogger = java.util.logging.Logger
            .getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME);
    globalLogger.setLevel(java.util.logging.Level.OFF);
    [... parse command line and possibly turn logging back on]

今Findbugsは言う「トラブル警告を出します:

ロガーへの変更はcom.bmw.fnw.DBMainDialog.main(String [])で失われる可能性があります

Find Bugs Descriptionから 、ロガーがすべきでないときに可能である可能性があることを理解しています。

ロガーを適切にオフにするにはどうすればよいですか?

4

3 に答える 3

4

必要な間 (おそらくプログラムの存続期間中)、ロガーへの強力な参照を保持してください。

あなたが与えたリンクはすでに理由を説明しています.OpenJDkでは、logManagerは内部的に弱い参照のみを保持します。そのため、強い参照がなくなるとすぐに、ロガーはガベージ コレクションの対象になります。したがって、構成を設定しますが、強力な参照を保持しません。ガベージコレクションされる可能性があります。Logger を再度取得すると、新しい Logger がインスタンス化されます。ガベージ コレクションは、強い参照を保持することによって防止されます。

于 2012-08-14T08:43:22.903 に答える
1

Find Bugsの説明に記載されているようにOpenJDKを使用していますか?

彼らが弱参照について話しているので、私の頭に浮かぶのは、ガベージコレクション中に失われないように、このロガーのどこかに静的参照を作成できるということです。

問題をテストするには、コード内で自分自身をガベージコレクターと呼んで、何かが変わるかどうかを確認します。

于 2012-08-14T08:41:14.340 に答える
0

私はまったく同じ問題を抱えていて、警告を取り除くこともできませんでした。FindBugs が私たちをいじっているだけなのかどうかはわかりませんが、強力な参照を保持することは役に立たないようです。

警告を取り除くために、単純に log4j を含めました。-Dlog4j.configuration=< FILE_PATH > を jvm 引数の一部として設定できます。FILE_PATH は、log4j.properties ファイルへのパスです。参照: JVM 引数による log4j 設定?

これにより、警告が表示されなくなり、引き続きデバッグ レベルを構成できます。お役に立てれば!

あ~

于 2012-08-17T07:01:24.347 に答える