2009-06-06 76 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文件:可能需要編寫一個最小程序來查看java認爲它在該文件中讀取的內容。


另一個更新

這條線:

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

有一個額外的結束括號。它不會編譯。確保您正在使用您認爲自己的課程文件。

+0

好吧,它確實與readConfiguration行有關係 - 我使用調試器對此進行了調整,並在此調用後清除了LogManager的所有屬性。 – VolkA 2009-06-06 18:16:20

+5

哦,是的,明白了 - 我使用了兩次相同的輸入流,所以我需要使用configFile.reset()重新定位它 - 否則loadConfiguration()調用將無法讀取。順便說一句。 )只是從我的工作代碼複製錯誤。 – VolkA 2009-06-06 18:19:57

80

您可以通過命令行來設置你的日誌記錄配置文件:

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

這種方式似乎更清潔和更容易維護。

+0

是的,我可能會添加一個檢查,如果這個屬性被設置,並讓它覆蓋我的配置 - 儘管這一切都在一個配置文件,即使現成的工程將是很好的。謝謝! – VolkA 2009-06-06 18:06:18

3

您是否在尋找在正確的道路日誌文件: %H /一個%u.log

這裏%H解析爲您的家:在Windows此默認爲: C:\ Documents和Settings (用戶名)。

我已經嘗試過您發佈的示例代碼,並且在您指定配置文件路徑(logging.properties,通過代碼或java參數)後工作正常。

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

這是工作.. :) 你必須通過的InputStream在readConfiguration()。

相關問題