9

VM パラメータとして設定する必要がないように、実行時に Java util ログ設定ファイルを設定しようとしています。しかし、これはうまくいきません。構成を再読み込みしようとすると、ログはまったく無効になります。

次のコード スニペットを参照してください。

package test;

import java.io.FileInputStream;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class A {
  private static final Logger LOGGER= Logger.getLogger(A.class.getName());

  public static void main(String[] args) throws Exception {
    System.out.println("--- start");
    LOGGER.log(Level.SEVERE, "SEVERE 1");
    LOGGER.log(Level.FINEST, "FINEST 1");
    LogManager.getLogManager().readConfiguration();
    LOGGER.log(Level.SEVERE, "SEVERE 2");
    LOGGER.log(Level.FINEST, "FINEST 2");
    LogManager.getLogManager().readConfiguration(new FileInputStream("/tmp/logging.properties"));
    LOGGER.log(Level.SEVERE, "SEVERE 3");
    LOGGER.log(Level.FINEST, "FINEST 3");
    System.out.println("--- end");
  }
}

これは、VM 引数なしでクラスを実行した場合の出力です。

--- start
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 1
09.11.2012 09:59:25 test.A main
SCHWERWIEGEND: SEVERE 2
--- end

ご覧のとおり、SEVERE レベルのみがログに記録されます。これは、JRE の logging.properties のデフォルトであるためです。電話LogManager#readConfiguration()しても何も変わりません。しかし、logging.properties から構成を読み取ろうとすると、まったく何も記録されません。プロパティLogManager#readConfiguration(InputStream)の呼び出しまたは設定と の呼び出しに違いはありません。java.util.logging.config.fileLogManager#readConfiguration()

VM プロパティで同じコードを実行すると、次の出力が表示されます-Djava.util.logging.config.file=/tmp/logging.properties

--- start
2012-11-09 10:03:44.0838 SEVERE  [test.A#main()] - SEVERE 1
2012-11-09 10:03:44.0843 FINEST  [test.A#main()] - FINEST 1
--- end

ご覧のとおり、SEVERE レベルと FINEST レベルの両方がログに記録され、それらは異なる形式でログに記録されます。両方とも私のカスタムで指定されていますlogging.propertiesLogManager#readConfiguration()しかし、 !を呼び出した後、ここでロギングが停止します。これは上記の例とは異なり、私には理解できません。また、上記の例と同様に、呼び出しLogManager#readConfiguration(InputStream)は機能しません。

それで、問題は何ですか?javadoc設定によると、実行時に java.util.logging.config.file プロパティが機能するはずです。また、両方の readConfiguration() メソッドが期待どおりに機能するはずです。それで、問題は何ですか?

4

1 に答える 1

6

おそらく、ログのプロパティに問題があります。結果を得るには、構成 (ルートとコンソール) で両方のレベル仕様を使用する必要があることに気付きました。
ルート ロガー レベルが(など) を下回っFINESTている可能性があります。 または、まったく設定されていない場合は、.INFO.level=INFO
INFO

次の logging.properties を使用してコードを実行しました。

handlers=java.util.logging.ConsoleHandler
.level=FINEST
java.util.logging.ConsoleHandler.level=FINEST

-Djava.util.logging.config.file=/tmp/logging.properties出力を指定しないと、次のようになりました。

--- start
09.11.2012 14:25:49 testing.Scribble main
SCHWERWIEGEND: SEVERE 1
09.11.2012 14:25:49 testing.Scribble main
SCHWERWIEGEND: SEVERE 2
09.11.2012 14:25:49 testing.Scribble main
SCHWERWIEGEND: SEVERE 3
09.11.2012 14:25:49 testing.Scribble main
AM FEINSTEN: FINEST 3
--- end

正しく見えます!(私のテストクラスは testing.Scribble と呼ばれ、それが唯一の違いです)

-Djava.util.logging.config.file=/tmp/logging.properties出力の使用は次のとおりです。

--- start
09.11.2012 14:31:06 testing.Scribble main
SCHWERWIEGEND: SEVERE 1
09.11.2012 14:31:06 testing.Scribble main
AM FEINSTEN: FINEST 1
09.11.2012 14:31:06 testing.Scribble main
SCHWERWIEGEND: SEVERE 2
09.11.2012 14:31:06 testing.Scribble main
AM FEINSTEN: FINEST 2
09.11.2012 14:31:06 testing.Scribble main
SCHWERWIEGEND: SEVERE 3
09.11.2012 14:31:06 testing.Scribble main
AM FEINSTEN: FINEST 3
--- end

見た目もバッチリ!

于 2012-11-09T13:35:50.460 に答える