2009-06-06 9 views
68

私は愚かなJavaロギングの問題を抱えています:私は自分のアプリケーション構成ファイルからロギング設定をロードしていますが、ファイルを読み込んだ後は何もログに記録しません。追加のアプリケーション設定を除いてネット上にあります。これを削除することも役に立ちません。 "初期化中の..."というログ行はうまく表示されますが、 "開始アプリ"とそれ以降のメッセージはコンソールには記録されず、ログファイルも作成されません。私はここで何が欠けていますか?プロパティファイルを使用してJavaロギングを設定するにはどうすればよいですか? (java.util.logging)

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

... 
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 

答えて

23

さて、最初の直感ここにある:

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

のJava小道具ファイルパーサーはそれほどスマートではありませんが、これを処理するかどうかはわかりません。しかし、私はその間に....再びドキュメントを見て

を行くよ、試してみてください。

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

更新

いや、当たり前、必要に応じてより多くのコーヒー。気にしないで。

Propertiesのメソッドを使用してpropファイルをロードして印刷することができます。最小限のプログラムを書く価値があるかもしれません。


このライン別のアップデート:

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

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

+0

これはreadConfiguration行と何か関係があります。私はこれをデバッガで処理し、LogManagerのすべてのプロパティはこの呼び出し後にクリアされます。 – VolkA

+5

ああ、持っている - 同じ入力ストリームを2回使用しているので、configFile.reset()を使用してその位置を変更する必要があります。そうしないと、loadConfiguration()呼び出しには何も読み込まれません。 Btw。私の作業コードからのコピーエラーです)。 – VolkA

80

コマンドラインを通して、あなたのロギング構成ファイルを設定することができます。

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

この方法は、クリーナーや保守が容易と思われます。

+0

はい、このプロパティが設定されているとチェックを追加して、設定を上書きさせることができます。これをすべて1つの設定ファイルに入れておけば、すぐに使えるようになります。ありがとう! – VolkA

3

あなたは正しい道にログファイルを探しています:%hがあなたの家に解決ここで の%h /一パーセントu.log

:このデフォルト値は、Windowsでの: C:\ DocumentsとSettings (user_name)。

投稿したサンプルコードを試してみましたが、設定ファイルのパス(logging.propertiesコードまたはjava argsのいずれか)を指定すると正常に動作します。

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(); 
    } 
} 
+0

ここで、メインクラスに関してp.propertiesが必要ですか? –

4
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を渡すために()。

関連する問題