2009-06-06 74 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()。

相关问题