プロパティファイルを使用してJavaログを設定するにはどうすればよいですか?(java.util.logging)


82

私は愚かなJavaロギングの問題を抱えています:アプリ設定ファイルからロギング設定をロードしています-しかし、ファイルを読んだ後は何もログに記録されません(これはネット上にある例とほとんど同じですが、追加のアプリケーション構成-これを削除しても役に立ちません)。「initializing ...」ログ行は問題なく表示されますが、「starting app」以降のメッセージはコンソールに記録されず、ログファイルも作成されません。ここで何が欠けていますか?

ロガーコードは次のようになります。

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

そしてこれは設定ファイルです:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL

回答:


28

さて、最初の直感はここにあります:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

Javaプロップファイルパーサーはそれほど賢いわけではありません。これを処理できるかどうかはわかりません。しかし、私は再びドキュメントを見に行きます...。

それまでの間、次のことを試してください。

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

更新

いいえ、まあ、もっとコーヒーが必要でした。気にしないで。

もっと考えますが、プロパティのメソッドを使用できることに注意してくださいて小道具ファイルをロードおよび印刷てください。Javaがそのファイルで何を読み取ると考えるかを確認するために、最小限のプログラムを作成する価値があるかもしれません。


別の更新

この行:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

余分なエンドパレンがあります。コンパイルされません。自分が思っているクラスファイルで作業していることを確認してください。


まあ、それはreadConfiguration行と関係があることを意味します-私はデバッガーでこれをステップスルーし、LogManagerのすべてのプロパティはこの呼び出しの後にクリアされます。
VolkA

5
はい、わかりました-同じ入力ストリームを2回使用しているので、configFile.reset()を使用して再配置する必要があります-そうしないと、loadConfiguration()呼び出しは何も読み取ることができません。ところで。)は私の作業コードからの単なるコピーエラーでした。
VolkA

1
ここでの答えはよくわかりませんか?
Ondraジシュカ

@OndraŽižka答えは「構文エラーのためにコードが機能しなかった」です。
チャーリーマーティン

100

コマンドラインからログ設定ファイルを設定できます。

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

この方法は、よりクリーンで保守が容易なようです。


1
はい、おそらくこのプロパティが設定されているかどうかのチェックを追加して、構成を上書きさせます-ただし、これをすべて1つの構成ファイルに入れてすぐに使用できると便利です。ありがとう!
VolkA

12

上記のコードであなたのコードを試しましたが、[preferences.load(configFile);]ステートメントを使用しないでください。動作します。ここでサンプルコードを実行しています

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}

1
メインクラスに関連してp.propertiesはどこにあるべきですか?
ルイスソアレス2015

9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

これは機能しています.. :) readConfiguration()でInputStreamを渡す必要があります。


3

正しいパスでログファイルを検索していますか:%h / one%u.log

ここで%hはあなたの家に解決されます:Windowsではこれはデフォルトで:C:\ Documents and Settings(user_name)になります。

私はあなたが投稿したサンプルコードを試しましたが、構成ファイルのパス(コードまたはJava引数のいずれかを介してlogging.properties)を指定した後は正常に機能します。


サー、%hが私の家に解決され、%uが他の何かに解決されるなどのオンラインドキュメントがどこにあるか知っていますか?
LukAron19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.