如何使用属性文件设置java日志记录? (java.util.logging)
我有一个愚蠢的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
好了,第一直觉是在这里:
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"));
有一个额外的结束括号。它不会编译。确保您正在使用您认为自己的课程文件。
您可以通过命令行来设置你的日志记录配置文件:
$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass
这种方式似乎更清洁和更容易维护。
是的,我可能会添加一个检查,如果这个属性被设置,并让它覆盖我的配置 - 尽管这一切都在一个配置文件,即使现成的工程将是很好的。谢谢! – VolkA 2009-06-06 18:06:18
您是否在寻找在正确的道路日志文件: %H /一个%u.log
这里%H解析为您的家:在Windows此默认为: C:\ Documents和Settings (用户名)。
我已经尝试过您发布的示例代码,并且在您指定配置文件路径(logging.properties,通过代码或java参数)后工作正常。
我已经在上面的代码中尝试过你的代码,请不要使用 [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();
}
}
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()。
好吧,它确实与readConfiguration行有关系 - 我使用调试器对此进行了调整,并在此调用后清除了LogManager的所有属性。 – VolkA 2009-06-06 18:16:20
哦,是的,明白了 - 我使用了两次相同的输入流,所以我需要使用configFile.reset()重新定位它 - 否则loadConfiguration()调用将无法读取。顺便说一句。 )只是从我的工作代码复制错误。 – VolkA 2009-06-06 18:19:57