我有一个愚蠢的java日志记录问题:我正在从我的应用程序配置文件加载日志记录配置 - 但它只是在读取文件后没有记录任何内容(这看起来很像你会在网上找到的例子)除了额外的应用程序配置 - 删除它也没有帮助)。 “初始化...”日志行显得很好,但“启动应用程序”和任何其他消息既没有记录到控制台,也没有创建日志文件。我在这里缺少什么?
Logger代码如下所示:
...
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
答案 0 :(得分:87)
您可以通过命令行设置日志配置文件:
这种方式似乎更清洁,更容易维护。
$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass
答案 1 :(得分:24)
好的,第一个直觉就在这里:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL
Java prop文件解析器并不是那么聪明,我不确定它会处理这个问题。但我会再次看看文档....
同时,尝试:
handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL
更新
不,呃,需要更多的咖啡。没关系。
虽然我想更多,但请注意,您可以使用Properties中的方法来加载和打印prop文件:可能值得编写一个最小程序来查看java认为它在该文件中读取的内容。 / p>
另一次更新
这一行:
FileInputStream configFile = new FileInputStream("/path/to/app.properties"));
有一个额外的结局。它不会编译。确保你正在使用你认为的类文件。
答案 2 :(得分: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();
}
}
答案 3 :(得分:7)
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。
答案 4 :(得分:3)
您是否在正确的路径中搜索日志文件: %h / one%u.log
此处%h解析到您的家:在Windows中,默认为: C:\ Documents and Settings(user_name)。
我已经尝试了您发布的示例代码,并且在指定配置文件路径(通过代码或java args的logging.properties)后它可以正常工作。